zoukankan      html  css  js  c++  java
  • python+selenium显示等待、隐式等待和强制等待的区别

    在实际使用selenium或者appium时,等待下个等待定位的元素出现,特别是web端加载的过程,都需要用到等待,而等待方式的设置是保证脚本稳定有效运行的一个非常重要的手段,在selenium中(appium通用)常用的等待分为:

    显示等待WebDriverWait()隐式等待implicitly_wait()强制等待sleep()三种,下面我们就分别介绍一下这三种等待的区别

    • sleep(): 强制等待,设置固定休眠时间。后脚本的执行过程中执行 sleep()后线程休眠,而另外两种线程不休眠。
    • implicitly_wait():隐式等待,是设置的全局等待。设置等待时间,是对页面中的所有元素设置加载时间,即整个页面的加载时间;
    •                              如果超出了设置时间的则抛出异常。隐式等待可以理解成在规定的时间范围内,浏览器在不停的刷新页面,直到找到相关元素或者时间结束。
    • WebDriverWait():显示等待,是针对于某个特定的元素设置的等待时间,在设置时间内,默认每隔一段时间检测一次当前页面某个元素是否存在,如果在规定的时间内找到了元素,则直接执行,即找到元素就执行相关操作,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException。

    注意:显示等待是针对某一个元素进行相关等待判定;

              隐式等待不针对某一个元素进行等待,是全局元素等待;

    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    selenium的页面等待有显示等待和隐式等待

    隐式等待 :比较简单,提供一个等待时间,单位为秒,则等这个时间过去在去做其他操作。 driver.implicitly_wait(10),如果不设置默认为0

    显示等待 :指定某个条件,然后设置最长等待时间。如果在这个时间还没有找到元素,那么便会抛出异常。只有该条件触发,才执行后续代码,这个使用更灵活。

    主要涉及到selenium.webdriver.support 下的expected_conditions类

    注意:隐形等待是设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。

               注意这里有一个弊端,那就是程序会一直等待整个页面加载完成,也就是一般情况下你看到浏览器标签栏那个小圈不再转,才会执行下一步,

    -------------------------------------------------------------------------------------------------------------------------

    显示等待:WebDriverWait()

    导入包:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC

    WebDriverWait(  driver,  timeout,  poll_frequency=0.5,  ignored_exceptions=None  )

    driver:                      浏览器驱动
    timeout:                   最长超时时间,默认以秒为单位
    poll_frequency:       检测的间隔步长,默认为0.5s
    ignored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。

    --------------------------------------------------------------------------------------------------------------------------------------

    与until()或者until_not()方法结合使用

    (1)WebDriverWait(driver,10).until(method,message="")
             调用该方法提供的驱动程序作为参数,直到返回值为True


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

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

    --------------------------------------------------------------------------------------------------------------------------------------

    在设置时间(10s)内,等待后面的条件发生。如果超过设置时间未发生,则抛出异常。

    在等待期间,每隔一定时间(默认0.5秒),调用until或until_not里的方法,直到它返回True或False.

    WebDriverWait与expected_conditions结合使用:


    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By

    wait = WebDriverWait(driver,10,0.5)
    element =waite.until(EC.presence_of_element_located((By.ID,"kw"),message="")


    # 此处注意,如果省略message=“”,则By.ID外面是两层()

    -----------------------------------------------------------------------------------------------------------------------------------

    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By

    wait = WebDriverWait(driver,10,0.5)
    element =waite.until(EC.presence_of_element_located((By.ID,"kw"),message="")
    # 此处注意,如果省略message=“”,则By.ID外面是两层()

    ===============================================================================

    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By

    wait = WebDriverWait(driver,10,0.5)
    element =waite.until(EC.presence_of_element_located((By.ID,"kw"),message="")

    ================================================================================

    WebDriverWait() 语法格式如下:

    WebDriverWait(driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None).until(method,message=)

    或者
    WebDriverWait(driver,timeout,poll_frequency=POLL_FREQUENCY,ignored_exceptions=None).until_not(method,message=)


    driver, webdriver的驱动程序,如(IE、FireFox、chrome、safari等)
    timeout, 超时时间,默认以秒为单位
    poll_frequency, 休眠时间(步长)的间隔,默认为0.5秒,即检测元素是否存在的频率
    ignored_exceptions, 超时后的异常信息,默认情况下抛 “NoSuchElementException",大家可以定义忽略的异常信息

    WebDriverWait一般由until或until_not配合使用:

    until(method,message=")调用该方法提供的驱动程序做为一个参数,直到返回值不为False

    until_not(method,message=")调用该方法提供的驱动程序做为一个参数,直到返回值为False

    ================================================================================


    expected_conditions类提供的预期条件判断的方法

    方法 说明
    title_is                          判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值
    title_contains               判断当前页面的 title 是否包含预期字符串,返回布尔值
    presence_of_element_located             判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见
    visibility_of_element_located               判断元素是否可见(可见代表元素非隐藏,并且元素宽和高都不等于 0)
    visibility_of                                            同上一方法,只是上一方法参数为locator,这个方法参数是 定位后的元素
    presence_of_all_elements_located      判断是否至少有 1 个元素存在于 dom 树中。

                                                                 举例:如果页面上有 n 个元素的 class 都是’wp’,那么只要有 1 个元素存在,这个方法就返回 True
    text_to_be_present_in_element           判断某个元素中的 text 是否 包含 了预期的字符串
    text_to_be_present_in_element_value 判断某个元素中的 value 属性是否包含 了预期的字符串
    frame_to_be_available_and_switch_to_it 判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False
    invisibility_of_element_located                 判断某个元素中是否不存在于dom树或不可见
    element_to_be_clickable                          判断某个元素中是否可见并且可点击
    staleness_of                                             等某个元素从 dom 树中移除,注意,这个方法也是返回 True或 False
    element_to_be_selected                          判断某个元素是否被选中了,一般用在下拉列表
    element_selection_state_to_be                判断某个元素的选中状态是否符合预期
    element_located_selection_state_to_be 跟上面的方法作用一样,只是上面的方法传入定位到的 element,而这个方法传入 locator
    alert_is_present                                        判断页面上是否存在 alert


    ====================================================================================================================

  • 相关阅读:
    linux 之 系统监控
    Spring Cloud Eureka 常用配置及说明
    mysql的事务隔离级别
    什么场景中会用到java多线程(转)
    springboot配置druid连接池
    MyBatis标签详解(转)
    关于@JsonSerialize注解的使用方法
    layer绑定回车事件(转)
    php7+apache2.4配置
    Eclipse创建Maven项目不支持el表达式的解决方式
  • 原文地址:https://www.cnblogs.com/xiaobaibailongma/p/12046487.html
Copyright © 2011-2022 走看看