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


 

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

posted @ 2019-12-23 23:38  小白龙白龙马  阅读(4138)  评论(0编辑  收藏  举报