为什么要设置元素等待
直白点说,怕报错,哈哈哈!
肯定有人会说,这也有点太直白了吧。
用一句通俗易懂的话就是:等待元素已被加载完全之后,再去定位该元素,就不会出现定位失败的报错了。
如何避免元素未加载出来而导致定位失败 ?
三种方式,强制等待、隐式等待、显式等待!
1、强制等待
就是sleep()
,也叫硬等待;
缺点就是:如果等待时间过长,即使元素已被加载出来了,但还是要继续等,这样会导致整个脚本的执行上会浪费很多时间。
示例代码如下:
2、隐式等待
WebDriver
提供了三种隐性等待方法:
-
implicitly_wait
识别对象时的超时时间。过了这个时间如果对象还没找到的话就会抛出NoSuchElementException
异常。
-
set_script_timeout
异步脚本的超时时间。WebDriver
可以异步执行脚本,这个是设置异步执行脚本,脚本返回结果的超时时间。
-
set_page_load_timeout
页面加载时的超时时间。因为 WebDriver
会等页面加载完毕再进行后面的操作,所以如果页面超过设置时间依然没有加载完成,那么 WebDriver
就会抛出异常。
以上三种都是在整个webDriver生命周期有效,即全局设置,相当于全局变量!
示例代码如下:
3、显式等待
就是明确的要等到指定元素(相当于局部变量)的出现或者是某个元素的可点击等条件等到为止,才会继续执行后续操作,等不到,就一直等,如果在规定的时间之内都没找到,就会抛出异常!
显示等待与隐式等待相对,显示等待必须在每个需要等待的元素前面进行声明。
示例代码如下:
3.1、显示等待需要用到两个类
WebDriverWait
和expected_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秒;
如果某个控件比较特殊,需要更长的时间加载,比如十几秒或者更长,就可以使用显示等待对其进行单独处理;
优秀不够,你是否无可替代
软件测试交流QQ群:721256703,期待你的加入!!
欢迎关注我的微信公众号:软件测试君