【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类封装的几个常用的方法:

  1. title_is() 通过页面标题判断
#设置元素等待,直到标题出现:百度一下,你就知道
WebDriverWait(driver,3).until(ECS.title_is('百度一下,你就知道')) 
  1. title_contains() 通过页面标题内容包含关键字
#设置元素等待,直到标题包含:百度
WebDriverWait(driver,3).until(ECS.title_contains('百度')) 
  1. 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'))) 
  1. 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')))
  1. nvisibility_of_element_located(locator) 判断某元素是否不可见或不在dom中
WebDriverWait(driver,3).until(ECS.invisibility_of_element_located((By.CSS_SELECTOR,'#dide_button')))
  1. 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"),'关于百度')) 
  1. alert_is_present() 判断弹窗是否出现
WebDriverWait(driver,3).until(ECS.alert_is_present()) 

更多判断方法可见expected_conditions官方文档

  • 7
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值