WebDriver中的3种等待,一次讲清楚
资源分享【这份资料必须领取~】
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'))
相关文章
- 使用Jmeter进行性能测试的这套步骤,涨薪2次,升职一次
- 等保三级密码复杂度是多少?多久更换一次?
- Vue的Key属性,v-for和v-if,v-if/v-show,v-pre不渲染,v-once只渲染一次
- 《WEB安全渗透测试》(23):记一次利用SSRF漏洞到提权
- 力扣解法汇总面试题 01.05. 一次编辑
- uni-app微信相关开发问题记录:微信分享报错"包名不对,请检查包名是否与开放平台填写一致"、Android微信支付只能调起一次的问题、App微信登录与公众号微信登录的unionid不一致
- 记一次考前浪费的时间获取的一些小车心得
- springboot request 只能读取一次
- 【大数据】记一次hadoop集群missing block问题排查和数据恢复
- 问问题_Java一次导出百万条数据生成excel(web操作)
- [转]HttpClient连接池设置引发的一次雪崩
- [LeetCode] 1186. Maximum Subarray Sum with One Deletion 删除一次得到子数组最大和
- 一次java Cpu占用过高的排查