【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官方文档

相关推荐

  1. selenium元素等待

    2024-07-10 04:58:04       19 阅读
  2. Selenium - 设置元素等待及加载策略

    2024-07-10 04:58:04       13 阅读
  3. Selenium 等待

    2024-07-10 04:58:04       18 阅读
  4. selenium-鼠标、等待

    2024-07-10 04:58:04       50 阅读
  5. Selenium找界面元素

    2024-07-10 04:58:04       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-10 04:58:04       51 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-10 04:58:04       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-10 04:58:04       44 阅读
  4. Python语言-面向对象

    2024-07-10 04:58:04       55 阅读

热门阅读

  1. HTMLtable表转C#DataTable

    2024-07-10 04:58:04       28 阅读
  2. WPF设置全局样式

    2024-07-10 04:58:04       22 阅读
  3. AJAX学习笔记上(学习自用)

    2024-07-10 04:58:04       26 阅读
  4. linux之段错误的分析

    2024-07-10 04:58:04       23 阅读
  5. 三级_网络技术_11_路由设计技术基础

    2024-07-10 04:58:04       17 阅读
  6. Ubuntu上如何安装nvm包管理器

    2024-07-10 04:58:04       22 阅读
  7. python项目常见使用的传参调试方法

    2024-07-10 04:58:04       27 阅读
  8. 深入理解Spring Boot中的数据库优化

    2024-07-10 04:58:04       23 阅读
  9. HOW - React Router v6.x Feature 实践(react-router-dom)

    2024-07-10 04:58:04       19 阅读
  10. Mysql:时区问题

    2024-07-10 04:58:04       17 阅读
  11. WebSocket 双向通信

    2024-07-10 04:58:04       21 阅读
  12. 3102.最小化曼哈顿距离

    2024-07-10 04:58:04       23 阅读