Python中WebDriverWait等待使用_python webdriverwait_Charliefive
设置等待 wait = WebDriverWait(driver , 10 , 0.5) #使用匿名函数 wait . until(lambda diver : driver . find_element_by_id('kw'))...
Python中WebDriverWait等待使用
强制等待:sleep()
import time
time.sleep(5)
print("1")
缺点:不智能,太多影响速度。
隐式等待:implicitly_wait()
driver.implicitly_wait(10) #隐式等待10秒
由webdriver提供的方法,一旦设置,这个隐式等待会在WebDriver对象实例的整个生命周期起作用,它不针对某一个元素,是全局元素等待,即在定位元素时,需要等待页面全部元素加载完成,才会执行下一个语句。如果超出了设置时间的则抛出异常。
缺点:当页面某些js无法加载,但是想找的元素已经出来了,它还是会继续等待,直到页面加载完成(浏览器标签左上角圈圈不再转),才会执行下一句。某些情况下会影响脚本执行速度。
显示等待:WebDriverWait()
我爱你
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
- driver:浏览器驱动timeout:最长超时时间,默认以秒为单位poll_frequency:检测的间隔步长,默认为0.5signored_exceptions:超时后的抛出的异常信息,默认抛出NoSuchElementExeception异常。
与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.
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 =wait.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”)),即需要嵌套两层英文圆括号
显示等待,自定义等待条件
#设置等待
wait = WebDriverWait(driver,10,0.5)
#使用匿名函数
wait.until(lambda diver:driver.find_element_by_id('kw'))
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 |
find_element_by_link_text横线的问题
from selenium.webdriver.common.by import By
ind_element_by_xpath('**')改写为 find_element(By.XPATH,'**')
find_element_by_class_name('**')改写为find_element(By.CLASS_NAME,'**')
find_element_by_id('**')改写为find_element(By.ID,'**');
find_element_by_name('**')改写为find_element(By.NAME,'**');
find_element_by_link_text('**')改写为find_element(By.LINK_TEXT,'**')
相关文章
- Python 连接数据源与邮件功能(九)_大数据老司机
- 擎创技术流 | ClickHouse实用工具?ckman教程(10)_擎创夏洛克AIOps_clickhouse 管理工具
- 本地GitLab服务器搭建_gitlab搭建本地服务器_Coder个人
- 新手如何做跨境电商?这七个经验干货请收好!_东哥聊跨境_跨境电商怎么做
- 【web安全】SQL注入漏洞3--sqlmap工具教程_Coder_preston
- 【算法基础】高精度乘法_Weraphael
- LU Accepted or Rejected过程介绍_我想我思
- 制造业ERP如何做好成本核算管理?_正航ERP软件
- 沃太能源冲刺上市:亿纬锂能、高瓴均为股东,收入主要来自境外_贝多财经
- Python 高级编程之网络编程 SocketServer(七)_大数据老司机
- 【SQL开发实战技巧】系列(十):从拆分字符串、替换字符串以及统计字符串出现次数说起_赵延东的一亩三分地_sql正则表达式拆分字符串
- C#winform 绘图(直线、圆、虚线、矩形等等)总结_薪薪代码
- 【SQL开发实战技巧】系列(七):从有重复数据前提下如何比较出两个表中的差异数据及对应条数聊起_赵延东的一亩三分地
- 电路中的过压(OVP)过流(OCP)保护电路_ltqshs
- Qt 开发使用VSCode 笔记2_凶猛的瘦子
- 领域首创!合合信息与上海大学联合开启贵州原生态古彝文典籍数字化项目_合合技术团队