• Selenium4+Python3系列 - Selenium的三种等待,强制等待、隐式等待、显式等待


    为什么要设置元素等待

    直白点说,怕报错,哈哈哈!

    肯定有人会说,这也有点太直白了吧。

    用一句通俗易懂的话就是:等待元素已被加载完全之后,再去定位该元素,就不会出现定位失败的报错了。

    如何避免元素未加载出来而导致定位失败 ?

    三种方式,强制等待、隐式等待、显式等待!

    1、强制等待

    就是sleep() ,也叫硬等待;缺点就是:如果等待时间过长,即使元素已被加载出来了,但还是要继续等,这样会导致整个脚本的执行上会浪费很多时间。

    示例代码如下:

    1. # 强制等待案例
    2. driver.get("http://localhost:8080/wait.html")
    3. driver.find_element(By.ID, "wait").click()
    4. time.sleep(3)
    5. text = driver.find_element(By.ID, "green_box").text
    6. print('text is : '+text)

    2、隐式等待

    WebDriver 提供了三种隐性等待方法:

    • implicitly_wait

    识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElementException 异常。

    • set_script_timeout

    异步脚本的超时时间。WebDriver 可以异步执行脚本,这个是设置异步执行脚本,脚本返回结果的超时时间。

    • set_page_load_timeout

    页面加载时的超时时间。因为 WebDriver 会等页面加载完毕再进行后面的操作,所以如果页面超过设置时间依然没有加载完成,那么 WebDriver 就会抛出异常。

    以上三种都是在整个webDriver生命周期有效,即全局设置,相当于全局变量!

    示例代码如下:

    1. def init():
    2. # 最大化操作
    3. driver.maximize_window()
    4. driver.set_script_timeout(60)
    5. # 智能等待60秒,找到元素后立即继续执行,全局生效
    6. driver.implicitly_wait(60)
    7. driver.set_page_load_timeout(60)
    8. init()
    9. # 强制等待案例
    10. driver.get("http://localhost:8080/wait.html")
    11. driver.find_element(By.ID, "wait").click()
    12. # 硬等待
    13. # time.sleep(3)
    14. text = driver.find_element(By.ID, "green_box").text
    15. print('text is : '+text)

    3、显式等待

    就是明确的要等到指定元素(相当于局部变量)的出现或者是某个元素的可点击等条件等到为止,才会继续执行后续操作,等不到,就一直等,如果在规定的时间之内都没找到,就会抛出异常!

    显示等待与隐式等待相对,显示等待必须在每个需要等待的元素前面进行声明。

    示例代码如下:

    1. # -*- coding: utf-8 -*-
    2. """
    3. @Time :2022/10/31 8:12 PM
    4. @Auth : 软件测试君
    5. @File :test_wait.py
    6. @IDE :PyCharm
    7. @Motto:ABC(Always Be Coding)
    8. """
    9. from selenium import webdriver
    10. from selenium.webdriver.chrome.service import Service
    11. from selenium.webdriver.common.by import By
    12. from selenium.webdriver.support import expected_conditions as EC
    13. from selenium.webdriver.support.wait import WebDriverWait
    14. from webdriver_manager.chrome import ChromeDriverManager
    15. '''
    16. 初始化操作
    17. '''
    18. driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
    19. def init():
    20. # 最大化操作
    21. driver.maximize_window()
    22. init()
    23. driver.get("http://localhost:8080/wait.html")
    24. driver.find_element(By.ID, "wait").click()
    25. # 显示等待案例
    26. # 设置元素等待实例,最多等5秒,每0.5秒查看条件是否成立
    27. element = WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "green_box")))
    28. print('text is : ' + element.text)
    29. driver.quit()

    3.1、显示等待需要用到两个类

    WebDriverWaitexpected_conditions两个类。

    WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)参数说明:

    driver:浏览器驱动

    timeout:最长超时时间,默认以秒为单位

    poll_frequency:检测的间隔步长,默认为0.5s

    ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。

    3.2、until()和until_not()的方法

    until

    • WebDriverWait(driver,10).until(method,message="")

    • 调用该方法提供的驱动程序作为参数,直到返回值为True

    method: 在等待期间,每隔一段时间(__init__中的poll_frequency)调用这个传入的方法,直到返回值不是False

    message: 如果超时,抛出TimeoutException,将message传入异常

    until_not

    • WebDriverWait(driver,10).until_not(method,message="")

    • 调用该方法提供的驱动程序作为参数,直到返回值为False

    与until相反,until是当某元素出现或什么条件成立则继续执行,until_not是当某元素消失或什么条件不成立则继续执行,参数也相同。

    3.3、expected_conditions类

    各种类,达到某种条件,返回True和False,详细参考下表。

    3.4、显示等待,自定义等待条件

    示例代码如下:

     

    写在最后

    其实隐式等待和显示等待在本质上是一致的,只是显示等待多了一个指定元素条件超时时间,在使用场景上,可以使用隐式等待来做一个全局的控制,例如设置全局隐式等待6秒;

    如果某个控件比较特殊,需要更长的时间加载,比如十几秒或者更长,就可以使用显示等待对其进行单独处理;

  • 相关阅读:
    【微波工程学习记录1】功率分配器和定向耦合器
    [云原生]微服务架构是什么
    实验6 用例图
    阿里P8架构师进阶心得:分布式数据库架构MyCat学习笔记送给你
    SQL的delete和drop
    conda使用一般步骤
    mysql8安装步骤教程
    滚动条设置
    【蓝桥杯省赛真题46】python数字币统计 中小学青少年组蓝桥杯比赛 算法思维python编程省赛真题解析
    来自北大算法课的Leetcode题解:7. 整数反转
  • 原文地址:https://blog.csdn.net/m0_73409141/article/details/127636372