Python+Selenium4三大等待预期条件_web自动化(4)

news2025/7/16 6:42:13

目录

0. 上节回顾

1. 定位失败的原因

2. 强制等待

3. 隐式等待

4. 显式等待 【重点难点】

4.1. 实例化 WebDriverWait 对象

4.2. 指定等待条件

4.3. 等待条件的具体要求

4.3. 1. 等待条件是一个函数

4.3. 2. 返回值是布尔值

4.3. 3. 只有一个参数,参数值是driver

4.3. 4. 出现异常

5. 流畅等待 (最底层,最强大,最难)

5. 1. 元素闪现太快 

5. 2. 出现特殊异常

6. 等待策略可以复用

7. Selenium官网中:等待的警告

0. 上节回顾

  • WebDriver的角度看,有8种元素定位策略
  • 从浏览器的角度来看,有2种元素选择器:
    • CSS选择器执行效率高
    • XPath选择器使用效率高
  • 底层通过JS实现,可以通过F12进行获取、调试

1. 定位失败的原因

元素交互过程中出错:
  1. 元素不存在
  2. 元素不可见
  3. 元素被遮挡
  4. 元素被禁用

如:元素被延迟渲染

driver = webdriver.Chrome()  # 启动浏览器 是空白页

driver.get("http://118.24.147.95:8086/delay.html")
ele = driver.find_element(By.XPATH, '//*[@id="content"]/input')
print(ele)
selenium.common.exceptions.NoSuchElementException: Message: no such element:
Unable to locate element: {"method":"xpath","selector":"//*[@id="content"]/input"}
DEBUG秘技:

控制台输入 debugger 让网页停下来 

#cdp:chrome devtools 协议
driver.execute_cdp_cmd("Debugger.enable", {}) # JS断点 selenium 4 新特性 (执行的慢的话有概率失败)
driver.execute_script("setTimeout('debugger',0.1*1000)") #JS断电 selenium 3
pdb.set_trace()#python 断点
解决了定位失败的问题
driver = webdriver.Chrome()  # 启动浏览器 是空白页

driver.get("http://118.24.147.95:8086/delay.html")
#cdp:chrome devtools 协议
driver.execute_cdp_cmd("Debugger.enable", {}) # JS断点 selenium 4 新特性 (执行的慢的话有概率失败)
driver.execute_script("setTimeout('debugger',0.1*1000)") #JS断电 selenium 3
pdb.set_trace()#python 断点
ele = driver.find_element(By.XPATH, '//*[@id="content"]/input')
print(ele)
通过 DEBUG ,发现很多的元素是通过 JS 动态创建、改变、修改的,如果要定位准许,需要 等待 ”JS 完成
相关的操作:
  • 强制等待 sleep
  • 隐式等待 implicitly_wait
  • 显式等待 WebDriverWait
  • 流畅等待 FluentWait

2. 强制等待

sleep 实际上编程语言中的语句:当程序执行到 sleep 指令时,会暂停 x 秒,然后再继续执行
import time
time.sleep(6) # 定位代码,延迟6秒再执行
  • 以秒为单位
  • 可以是浮点数:(0.1秒)
使用方法简单粗暴,但是相对呆板,应用场景不多
如:验证 【登录成功】
driver = webdriver.Chrome()  # 启动浏览器 是空白页

driver.get("http://101.34.221.219:8010/?s=user/loginInfo.html")
driver.find_element(By.XPATH,"/html/body/div[4]/div/div[2]/div[2]/div/div/div[1]/form/div[1]/input",).send_keys("tiancao")
driver.find_element(By.XPATH,"/html/body/div[4]/div/div[2]/div[2]/div/div/div[1]/form/div[2]/div/input",).send_keys("ganju123")
driver.find_element(By.XPATH,"/html/body/div[4]/div/div[2]/div[2]/div/div/div[1]/form/div[3]/button",).click() # 点击登录
time.sleep(1) # sleep的值不好取,太大 或者 太小,都会失败
msg = driver.find_element(By.XPATH,"//p[@class='prompt-msg']",).text
assert msg == "登录成功" # 没有任何输出,说明断言成功
#driver.quit()
对于出现之后会 消失 的元素来讲,要求 sleep 的秒数相当精确
学习 selenium 中提供 等待 来进行解决

3. 隐式等待

原理:让 selenium 在查找元素时,如果失败,就重试
默认:参数为 0 表示禁用
启用:参数大于 1 即可
特点:一旦启用,全局 (driver) 生效
弊端:
  • 只会等待元素出现
  • 不会等待元素就绪
driver = webdriver.Chrome()  # 启动浏览器 是空白页

# driver.implicitly_wait(0) #禁用
driver.implicitly_wait(10) # 启用隐式等待,每一次等待最长不超过10秒
driver.get("http://118.24.147.95:8086/delay.html")
msg = driver.find_element(By.XPATH, '//*[@id="content"]/p').text
ele = driver.find_element(By.XPATH, '//*[@id="content"]/input')
assert msg == "大家好,我是天草柑橘"
对于复杂的业务场景,不只要求元素存在,还要求元素的状态就绪
http://118.24.147.95:8086/flash.html
如果要对等待条件,进行定制,就需要用到显式等待

4. 显式等待 【重点难点

显示等待指的是 WebDriverWait 对象
所谓 显式 ,是为了相对于前面的 隐式 而言的,
在显式等待中:等待的时机、内容,根据清晰、直观、可控

4.1. 实例化 WebDriverWait 对象

  • 两个参数 (固定写法) driver: WebDriver实例 (浏览器对象)
  • 10 :超时时间,等待最多不超过10
WebDriverWait(driver, 10)

4.2. 指定等待条件

灵活写法(难写法)
msg = WebDriverWait(driver, 10).until(
lambda x: driver.find_element(
By.XPATH,
"//p[@class='prompt-msg']",
).text
)
# 等待条件(匿名函数)
lambda x: driver.find_element(
By.XPATH,
"//p[@class='prompt-msg']",
).text
x 是匿名函数的参数,被传递了 driver
driver = webdriver.Chrome()  # 启动浏览器 是空白页

driver.get("http://101.34.221.219:8010/?s=user/loginInfo.html")
driver.find_element(By.XPATH,"/html/body/div[4]/div/div[2]/div[2]/div/div/div[1]/form/div[1]/input",).send_keys("tiancao")
driver.find_element(By.XPATH,"/html/body/div[4]/div/div[2]/div[2]/div/div/div[1]/form/div[2]/div/input",).send_keys("ganju123")
driver.find_element(By.XPATH,"/html/body/div[4]/div/div[2]/div[2]/div/div/div[1]/form/div[3]/button",).click() # 点击登录

msg = WebDriverWait(driver, 10).until(lambda x: driver.find_element(
By.XPATH,
"//p[@class='prompt-msg']",
).text)
assert msg == "登录成功",f"{msg}" # 没有任何输出,说明断言成功
#driver.quit()

4.3. 等待条件的具体要求

成功例子:在等待中,定位元素,函数返回了布尔值True 再交互 

driver = webdriver.Chrome()  # 启动浏览器 是空白页

driver.get("http://118.24.147.95:8086/delay.html")
ele = WebDriverWait(driver, 10).until(
lambda x: driver.find_element(By.XPATH, '//*[@id="content"]/input')
)
ele.click() #元素交互
#driver.quit()
driver.find_element(By.XPATH, '//*[@id="content"]/input') 的返回值, 是一个对象,它布尔值是 True
失败的例子:在等待中,交互元素
driver = webdriver.Chrome()  # 启动浏览器 是空白页
driver.get("http://118.24.147.95:8086/delay.html")
WebDriverWait(driver, 10).until( # 定位元素
lambda x: driver.find_element(By.XPATH, '//*
[@id="content"]/input').click()
)
返回值是 driver.find_element(By.XPATH, '//* [@id="content"]/input').click() 是None,它的布尔值是 False

4.3. 1. 等待条件是一个函数

可以是普通函数
也可以是匿名函数
匿名函数 和普通函数有什么区别?
区别
普通函数
匿名函数
关键
def
lambda
名字
有名字
没有名字
长度
可以多行
只能一行
返回值
可选,用 return 指定
必选,返回表达式结果

4.3. 2. 返回值是布尔值

  • 必须是布尔值,不是布尔值, 也会按照布尔值进行判断
  • 如果判断为Ture,表示等待成功,停止等待
  • 如判断为False,表示等待失败,继续等到,直到超时,

4.3. 3. 只有一个参数,参数值是driver

4.3. 4. 出现异常

出现 NoSuchElementException 异常表示等待失败,将继续等待
出现其他异常,表示出错,停止等待
出现 TimeOut 异常,表示超时,停止等待
总结
1. 是个函数
2. 有且只有一个参数,参数值是 driver
3. 返回值应该是布尔值 如果是 Ture ,表示等待成功,停止等待
  • 如果是False,表示等待失败,继续等待,直到超时
  • 如果是 NoSuchElementException 异常,表示等待失败,继续等待
  • 如果是其他异常,表示出错,停止等待

如果,想要以False表示成功怎么办?可以使用 until_not 方法:

  • 如果是Ture,表示等待失败,继续等待,直到超时
  • 如果是False,表示等待成功,停止等待
# WebDriverWait(driver, 10).until(lambda x: False) # 会超时
WebDriverWait(driver, 10).until_not(lambda x: False) # 会成功

5. 流畅等待 (最底层,最强大,最难)

selenium 核心是用什么语言开发的? java
Java 语言中,流畅等待指的是 FluentWait 对象,是 WebDriverWait 的父类
Python 中,没有定义 FluentWait 对象,直接使用 WebDriverWait 对象完成流畅等待
和显式等待相比,流畅等待增加 2 个参数
  • 重试频率 (等待的原理:失败重试,多久重试一次?)
  • 忽略的异常列表
可以实现更加复杂的业务场景

5. 1. 元素闪现太快 

driver = webdriver.Chrome()  # 启动浏览器 是空白页

driver.get("http://118.24.147.95:8086/flash_fast.html")
WebDriverWait(driver, 10, 0.01).until( # 调整了重试频率
lambda x: driver.find_element(By.XPATH, "//p")
)

5. 2. 出现特殊异常

with get_webdriver() as driver:
driver.get("http://118.24.147.95:8086/delay_alert.html")
alert = WebDriverWait(
driver,
10,
ignored_exceptions=[
NoAlertPresentException
], # 在等待过程中,如果出现NoAlertPresentException, 就继续等待
).until(lambda x: driver.switch_to.alert)
print(alert.text)

6. 等待策略可以复用

复用前
driver = webdriver.Chrome()  # 启动浏览器 是空白页

driver.implicitly_wait(10) # 隐式等待只要设置一次
driver.get("http://118.24.147.95:8086/flash.html")

p = WebDriverWait(driver, 10).until( # 显式等待要设置1次
lambda x: driver.find_element(By.XPATH, "//p"))

p = WebDriverWait(driver, 10).until( # 显式等待要设置1次
lambda x: driver.find_element(By.XPATH, "//input"))
#driver.quit()
复用后
driver = webdriver.Chrome()  # 启动浏览器 是空白页

driver.wait = WebDriverWait(driver, 10) # 等待策略 设置1次
driver.get("http://118.24.147.95:8086/flash.html")
p = driver.wait.until(lambda x: driver.find_element(By.XPATH, "//p"))
i = driver.wait.until(lambda x: driver.find_element(By.XPATH, "//input"))# 到处使用
#driver.quit()

7. Selenium官网中:等待的警告

隐式等待 和显式 等待不要混用
在框架,只用显式等待(或者流畅等待)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/361392.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

查询服务器tns文件路径,oracle数据库tns配置方法详解

查询服务器tns文件路径,oracle数据库tns配置方法详解 TNS简要介绍与应用 Oracle中TNS的完整定义:transparence Network Substrate透明网络底层, 监听服务是它重要的一部分,不是全部,不要把TNS当作只是监听器。 TNS是Oracle Net…

scrum敏捷开发实践—leangoo任务看板

任务板展现了我们在Sprint过程中所有要完成的任务。在Sprint过程中我们要不断的更新它。–如果某个开发人员想到了一个任务他就可以把这个任务写下来放在任务墙上。无论每日站会过程中或者之后,如果估计发生了变化,任务会根据变化在任务墙上做相应的调整…

云业务成本的组成与管理趋势

在过去几年里,社会经济环境对云服务的采用产生了巨大的影响。如今,全球各规模公司都在加速数字化转型,包括转向基于云的应用程序,以支持远程工作人员,同时迅速推出新的云服务来更好地留住客户。在诸多经济环境不稳定因…

linux部署zookeeper

linux部署zookeeper 1、单机部署zk ZooKeeper服务器是用Java创建的,它需要在JVM上运行,所以需要使用JDK1.6及以上版本,一般都是jdk1.8。 选择自己安装本地的jdk,而不是centos自带的openjdk。 查看本地安装的jdk: j…

vue中go.js的使用教学(四:模型及模板)

目录 一、使用代码构建图表 二、使用模型和模板 a、创建基础图表 b、定义模板(将节点模板定义为我们上面所做的特定节点构造的泛化) 三、使用数据绑定参数化节点 a、使用数据绑定参数化节点 扩展:修改模型 一、使用代码构建图表 场景&…

Goreplay使用教程0221

1、简介Goreplay 是用 Golang 写的一个HTTP 实时流量复制工具。功能更强大,支持流量的放大、缩小,频率限制,还支持把请求记录到文件,方便回放和分析,也支持和 ElasticSearch 集成,将流量存入 ES 进行实时分…

2023 Softing在线培训计划

通过以实践为导向的培训课程提高能力 小型和模块化的培训研讨会,是一种以实践为导向的用户研讨会,并结合了深厚的理论知识。通过Softing的初级和高级研讨会,我们将帮助您应对日常挑战。我们还为初学者和高级用户提供了有关车辆诊断和通信工具…

一维,二维差分の详解(简单易懂)

一,差分定义差分,就是前缀和的逆运算。二,具体过程1.一维差分例题构造差分数组首先给定一个原数组a:a[1], a[2], a[3],,,,,, a[n];然后我们构造一个数组b : b[1], b[2], b[3],,,,,, b[i];使得 a[i] b[1] b[2] b[3] ,,,,,, b[i]也就是说,…

数据挖掘,计算机网络、操作系统刷题笔记52

数据挖掘,计算机网络、操作系统刷题笔记52 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,orac…

【Linux】vim的使用及常用快捷键(不会使用vim?有这篇文章就够了)

🔥🔥 欢迎来到小林的博客!!       🛰️博客主页:✈️小林爱敲代码       🛰️欢迎关注:👍点赞🙌收藏✍️留言 目录💖vim的基本概念vi…

C语言——动态内存管理

目录0. 思维导图:1. 为什么存在动态内存分配2. 动态内存函数介绍2.1 malloc和free2.2 calloc2.3 realloc3. 常见的动态内存错误3.1 对NULL指针的解引用操作3.2 对动态内存开辟的空间越界访问3.3 对非动态开辟内存使用free释放3.4 使用free释放一块动态开辟内存的一部…

读书笔记//来自公众号(2)

非常喜欢阅读同行的文章,彷佛进行一场隔空交流。大家都是数据分析师,有许多共鸣;了解数据分析在不同行业的应用,往往很有收获。 这位朋友在零售行业、工业物联网、汽车互联网、2G电商等做个数据分析,有10多工作经验。…

【STC8A8K64D4开发板】——搭建开发环境

第1-2讲:搭建开发环境 需要安装的工具软件 表1:需要的工具软件 序号 软件工具 说明 1 Keil C51 9.52安装文件 Keil C51集成开发环境。 2 ch341ser驱动 USB最新驱动可到沁恒官网下载:www.wch.cn/downloads/CH341SER_EXE.html 3 st…

JVM运行时数据区

在上篇文章中我们详细介绍了JVM类加载子系统:https://blog.csdn.net/u011837804/article/details/129049418,Class文件被类加载子系统加载后就进入到了运行时数据区等待执行引擎执行,运行时数据区也是JVM中最重要的一部分,GC、OOM…

基于springboot+mybatis+mysql+vue运动会报名管理系统

基于springbootmybatismysqlvue运动会报名管理系统一、系统介绍二、功能展示1.用户登陆2.报名详情(运行员)3.比赛报名(运动员)4.个人参赛项目(运动员)5.加油稿展示(运动员)6.学院积分排名(运动员…

Spring MVC 源码 - HandlerMapping 组件(三)之 AbstractHandlerMethodMapping

HandlerMapping 组件HandlerMapping 组件,请求的处理器匹配器,负责为请求找到合适的 HandlerExecutionChain 处理器执行链,包含处理器(handler)和拦截器们(interceptors)handler 处理器是 Objec…

K_A12_022 基于STM32等单片机驱动VL53L0X模块 串口与OLED0.96双显示

K_A12_022 基于STM32等单片机驱动VL53L0X模块 串口与OLED0.96双显示一、资源说明二、基本参数参数引脚说明三、驱动说明UART对应程序:IIC对应程序:四、部分代码说明1、接线引脚定义1.1、STC89C52RCVL53L0X模块1.2、STM32F103C8T6VL53L0X模块五、基础知识学习与相关资料下载六、…

打印流、转换流、数据流 、随机访问流

Java知识点总结:想看的可以从这里进入 目录5、打印流6、转换流7、数据流8、随机访问流5、打印流 实现将基本数据类型的数据格式转化为字符串输出,它们提供了一系列重载的print()和println()方法,用于多种数据类型的输出,这种流不会…

基于react+typescript的前端组件库violet-design(字节青训营项目)

文章目录前言一、项目介绍💌 介绍特性兼容性📦 安装使用 npm 安装使用 yarn 安装浏览器引入🔨 示例1. 引入样式2. 使用组件按需加载TypeScript✨ 组件🔗 链接二、项目实现2.1 技术选型2.2 架构设计2.2.1 目标用户和场景2.2.2 组件…

容器技术概述

容器化应用程序 软件应用程序通常依赖于运行时环境提供的其他库、配置文件或服务。软件应用程序的传统运行环境是物理主机或虚拟机,应用程序依赖项作为主机的一部分安装。 例如,考虑一个 Python 应用程序,它需要访问实现 TLS 协议的公共共享…