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

这篇具有很好参考价值的文章主要介绍了Python+Selenium4三大等待&预期条件_web自动化(4)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

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. 元素被禁用

如:元素被延迟渲染

selenium流畅等待,Web自动化框架,自动化,selenium,python,测试工具

with get_webdriver() as driver:
    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秘技:
selenium流畅等待,Web自动化框架,自动化,selenium,python,测试工具

控制台输入 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 断点
解决了定位失败的问题
with get_webdriver() as driver:
    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)
> f:\pythonworkspace\ui_p39_selenium4\1.py(18)<module>()
-> ele = driver.find_element(By.XPATH, '//*[@id="content"]/input')
(Pdb) 
通过 DEBUG ,发现很多的元素是通过 JS 动态创建、改变、修改的,如果要定位准许,需要 等待 ”JS 完成
相关的操作:
  • 强制等待 sleep
  • 隐式等待 implicitly_wait
  • 显式等待 WebDriverWait
  • 流畅等待 FluentWait

2. 强制等待

sleep 实际上编程语言中的语句:当程序执行到 sleep 指令时,会暂停 x 秒,然后再继续执行
import time
time.sleep(6) # 定位代码,延迟6秒再执行
  • 以秒为单位
  • 可以是浮点数:(0.1秒)
使用方法简单粗暴,但是相对呆板,应用场景不多
如:验证 【登录成功】
with get_webdriver() as driver:
    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 == "登录成功"  # 没有任何输出,说明断言成功
对于出现之后会 消失 的元素来讲,要求 sleep 的秒数相当精确
学习 selenium 中提供 等待 来进行解决

3. 隐式等待

原理:让 selenium 在查找元素时,如果失败,就重试
默认:参数为 0 表示禁用
启用:参数大于 1 即可
特点:一旦启用,全局 (driver) 生效
弊端:
  • 只会等待元素出现
  • 不会等待元素就绪
with get_webdriver() as driver:
    # 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 再交互 

with get_webdriver() as driver:
    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.find_element(By.XPATH, '//*[@id="content"]/input') 的返回值, 是一个对象,它布尔值是 True
失败的例子:在等待中,交互元素
   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. 元素闪现太快 

selenium流畅等待,Web自动化框架,自动化,selenium,python,测试工具

with get_webdriver() as driver:
    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. 出现特殊异常

selenium流畅等待,Web自动化框架,自动化,selenium,python,测试工具

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. 等待策略可以复用

selenium流畅等待,Web自动化框架,自动化,selenium,python,测试工具

复用前
with get_webdriver() as driver:
    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"))
复用后
with get_webdriver() as driver:
    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"))  # 到处使用

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

selenium流畅等待,Web自动化框架,自动化,selenium,python,测试工具文章来源地址https://www.toymoban.com/news/detail-676464.html

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

到了这里,关于Python+Selenium4三大等待&预期条件_web自动化(4)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Selenium自动化测试:详解显示等待和条件类

    了解Selenium中的显示等待和条件类,以确保UI自动化测试用例的稳定性。掌握各种等待条件,如元素出现、可见、可点击等,以及实现原理。

    2024年02月03日
    浏览(46)
  • 自动化测试之八大元素定位方式(python3.10+selenium4)

    元素的定位是自动化测试核心。要操作一个对象,首先要识别定位或找到这个对象。为了实现网页整体布局,我们先要知道,一个元素,是如何定位到页面上的某个位置的,这就是元素定位。 系统环境 Windows 11 📌 python3.10.5 🔖 selenium 4.8.0 🚩 注意:以下每种定位方式均有一

    2024年02月03日
    浏览(80)
  • web自动化之基础内容二(全网最详细,selenium获取断言信息,显示等待和隐式等待,xpath高级语法)-第二天

    获取到的断言信息就是实际结果 预期结果使我们确定的,直接写在代码中的 而实际结果是无法确定的,所以需要用一些方法去获取 代码示例 场景:当我们加载页面的时候,一些元素是需要时间的 就有可能发生,代码执行到了,而元素没有被加载出来 此时就会出现找不到元

    2024年01月17日
    浏览(45)
  • 浏览器常用基本操作之python3+selenium4自动化测试(基础篇)

    1、打开指定的网页地址 我们使用selenium进行自动化测试时,打开浏览器之后,第一步就是让浏览器访问我们指定的地址,可使用get方法实现 1 2 3 from selenium import webdriver driver = webdriver.Edge() driver.get( \\\'https://www.baidu.com/\\\' )   # 本行用于访问指定的地址 2、获取当前页面url 我们在

    2024年02月01日
    浏览(78)
  • 013-Python3.11.8+selenium4.18.1+Web元素定位大法

    2024现烤现卖热乎的自动化测试之《元素定位大法》最新版本教程 环境配置:         Python版本:Python3.11.8         Selenium版本:Selenium4.18.1         Firfox版本:123.0.1(64位)

    2024年03月20日
    浏览(59)
  • python自动化测试selenium核心技术三种等待方式

    UI自动化测试过程中,可能会出现因测试环境不稳定、网络慢等情况,如果不做任何处理的话,会出现无法定位到特定元素而报错,导致自动化测试无法顺利执行。 selenium官网手册:Waits | Selenium slenium自动化测试中,主要涉及三种等待方式:     缺点:即使网络条件较好时

    2024年04月11日
    浏览(60)
  • selenium三大等待

    1.设置完等待后不管有没有找到元素,都会执行等待,等待结束后才会执行下一步 2.实例: 1.设置全局等待,对每个查询的元素都生效,当页面元素没有第一时间找到,会等待implicitly_wait设置的时间,时间过后再查找一次,要是还没找到就报错。 2.实例: 同时,在这我为大家

    2024年02月01日
    浏览(34)
  • Selenium-三大等待和四大操作

    一、三大等待 WebdriverWait 1、sleep()强制等待 time.sleep() 2、智能等待:最多等待15秒,如果在15秒内,任何一个时候元素出现了,那就继续下一行代码,超时了,报超时异常,TimeoutException,NosuchElementException 2.1隐形等待:从implicitly_wait(10)源码的注释中可以看到,隐形等待的用

    2023年04月25日
    浏览(29)
  • Selenium4自动化测试框架

    Selenium 介绍 Selenium 是目前用的最广泛的 Web UI 自动化测试框架,核心功能就是可以在多个浏览器上进行自动化测试,支持多种编程语言,目前已经被 google,百度,腾讯等公司广泛使用。 1、配置 google 驱动的环境变量,如果不配置需要在代码中指定驱动位置。 2、eclipse 中导入

    2024年02月03日
    浏览(46)
  • selenium4 自动化测试--环境安装和基础操作

    最近也有很多人私下问我,selenium学习难吗,基础入门的学习内容很多是3以前的版本资料,对于有基础的人来说,3到4的差别虽然有,但是不足以影响自己,但是对于没有学过的人来说,通过资料再到自己写的代码,发现有些东西没有,有些方法又不相同,导致脚本不能运行

    2024年01月21日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包