【selenium】元素等待
1、三种元素等待的区别
特点sleep隐式等待显示等待原理不论网页/元素是否加载完成,都会强制等待x秒设置一个等待时间,等待页面元素在规定时间内全部加载完后执行下一步,超出规定时间不等待显式等待 相比隐式等待更灵活,是先设定一个条件函数和一个最长等待时长,轮询判断条件函数的返回值,如果返回 True,则开始执 行后面的操作,否则会一直等待,直到超时报元素未找到异常等待对象无指定等待元素页面的所有元素定位的目标元素适用场景减慢自动化脚本执行的速度来调试设置整个页面的加载等待时间针对某个元素设置等待缺点不论元素是否加载完都会等待x秒,直到到了等待时间,效率最低所需的元素已经完成加载,会继续等待页面其他"不相关"元素加载完成,效率低代码相对前两种较复杂优点简单粗暴设置一次,整个webdrver生命周期内生效执行时间最短,效率最高语法
time.sleep(5)
driver.implicitly_wait(5)
WebDriverWait(self.driver, timeout, frequency).until(EC.visibility_of_element_located(loc))
2、sleep等待
原理:程序休眠
示例:
import time
time.sleep(5)
3、隐式等待
原理:设置一个等待时间,等待页面元素在规定时间内全部加载完后执行下一步,超出规定时间不等待
示例:
# 隐式等待设定时长为5s
driver.implicitly_wait(5)
driver.get('http://www.baidu.com')# 隐式等待所有元素加载完成,直到超过设定的最长时间
driver.find_element_by_id("kw").sendkeys('百度')
4、显示等待
原理 :显式等待 相比隐式等待更灵活,是先设定一个条件函数和一个最长等待时长,轮询判断条件函数的返回值,如果返回 True,则开始执 行后面的操作,否则会一直等待,直到超时报元素未找到异常
常用的类:
WebDriverWait
&
expected_conditions
|
4.1 WebDriverWait类
WebDriverWait 是 Selenium 提供的一种等待机制,用于等待页面上某个元素的出现或者达到某种状态
语法结构:
WebDriverWait(self.driver, timeout, frequency).until(EC.visibility_of_element_located(loc))
或
WebDriverWait(self.driver, timeout, frequency).until_not(EC.visibility_of_element_located(loc))
- timeout: 超时时间,单位秒
- frequency:轮询间隔,默认0.5s
- until:等待条件,如果条件返回True执行下一步,否则等待超时后抛出TimeoutException异常
- until_not:等待条件,如果条件返回False执行下一步,否则等待超时后抛出TimeoutException异常
使用示例:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://baidu.com")# 设置等待10s,
element =WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID,"kw")))
4.2 expected_conditions类
expected_conditions用于定义和判断条件是否满足的工具类,用于指定等待条件。
以下是expected_conditions类封装的几个常用的方法:
title_is()通过页面标题判断
#设置元素等待,直到标题出现:百度一下,你就知道
WebDriverWait(driver,3).until(ECS.title_is('百度一下,你就知道'))
title_contains()通过页面标题内容包含关键字
#设置元素等待,直到标题包含:百度
WebDriverWait(driver,3).until(ECS.title_contains('百度'))
presence_of_element_located(locator)判断某个元素是否存在于dom树中,页面上不一定可见presence_of_all_elements_located(locator)判断定位的任意元素是否存在于dom树中, 页面上不一定可见
WebDriverWait(driver,3).until(ECS.presence_of_element_located((By.ID,'kw')))
WebDriverWait(driver,3).until(ECS.presence_of_all_elements_located((By.CSS_SELECTOR,'.s_ipt')))
visibility_of_element_located(locator)判断元素在页面上是否可见,且宽高≠0visibility_of_any_elements_located(locator)判断定位的任意元素在页面上是否可见visibility_of(element)判断元素加载到dom中,且页面可见 ,两者等价
# 等待定位的元素出现在页面上
WebDriverWait(driver,3).until(ECS.visibility_of_element_located((By.ID,'kw')))# 等待定位的任意一个元素出现在页面上
WebDriverWait(driver,3).until(ECS.visibility_of_any_elements_located((By.CSS_SELECTOR,'.s_ipt')))# 等待定位的元素出现在页面上
WebDriverWait(driver,3).until(ECS.visibility_of(driver.find_element(By.ID,'su')))
nvisibility_of_element_located(locator)判断某元素是否不可见或不在dom中
WebDriverWait(driver,3).until(ECS.invisibility_of_element_located((By.CSS_SELECTOR,'#dide_button')))
text_to_be_present_in_element(locator, text_)判断某元素是否包含指定文字
WebDriverWait(driver,3).until(ECS.text_to_be_present_in_element((By.XPATH,"//* [@id='bottom_layer']/div/p[1]/a"),'关于百度'))
alert_is_present()判断弹窗是否出现
WebDriverWait(driver,3).until(ECS.alert_is_present())
更多判断方法可见expected_conditions官方文档
版权归原作者 青格er 所有, 如有侵权,请联系我们删除。