zl程序教程

您现在的位置是:首页 >  其它

当前栏目

WebDriver中的3种等待,一次讲清楚

一次 等待 WebDriver 讲清楚
2023-09-11 14:15:51 时间

资源分享【这份资料必须领取~

1、强制等待:sleep()

设置固定休眠时间,单位为秒。由Python的time包提供, 导入time包后就可以使用。

缺点:不智能,使用太多的sleep会影响脚本运行速度。

2、隐式等待:implicitly_wait()

由WebDriver提供的方法,一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期(创建到关闭)起作用,它不针对某一个元素,是全局元素等待,即在定位元素时,需要等待页面全部元素加载完成,才会执行下一个语句;如果超出了设置时间的则抛出异常。

缺点:当页面某些js无法加载,但是想找的元素已经出来了,它还是会继续等待,直到页面加载完成(浏览器标签左上角圈圈不再转),才会执行下一句。某些情况下会影响脚本执行速度。

3、显示等待:WebDriverWait()

需要通过from selenium.webdriver.support.wait import WebDriverWait导入模块,单独针对某个特定元素设置的等待时间,可以根据不同元素设置不同的等待条件,driver会在查询周期内去查询该元素是否准备好,如果ok则继续往下,如果不ok的话则继续等待直到超时为止。

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

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

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

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

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

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

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

2 )WebDriverWait与expected_conditions结合使用

from selenium.webdriver.support import expected_conditions as ECfrom selenium.webdriver.common.by import Bywait = WebDriverWait(driver,10,0.5)element =waite.until(EC.presence_of_element_located((By.ID,"kw")),message="")# 此处注意,如果省略message=“”,则By.ID外面是三层()

最初执行的代码一开始是这样写:presence_of_element_located(By.ID, "su"),这样相当于取到了3个参数(self, By.ID, "su"),而presence_of_element_located类中__init__()方法取的确实是2个参数(self, locator),其中locator调用的是一个tuple(元组)。

该元组(By.ID, "su")作为一个整体,对应相当于1个参数,加上类实例化代表自身的self参数,正好就是2个参数。

因此,执行代码正确的写法为:presence_of_element_located((By.ID, "su")),即需要嵌套两层英文圆括号。

3)显示等待,自定义等待条件

#设置等待
wait = WebDriverWait(driver,10,0.5)
#使用匿名函数
wait.until(lambda diver:driver.find_element_by_id('kw'))