在实际使用 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
====================================================================================================================
来源: http://www.bubuko.com/infodetail-3347182.html