【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)
判断元素在页面上是否可见,且宽高≠0
visibility_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官方文档