软件测试 —— Selenium(等待)

news2025/1/18 4:32:10

软件测试 —— Selenium(等待)

  • 一个例子
  • 强制等待
    • 使用示例:
      • 为什么不推荐使用强制等待?
      • 更好的选择
  • 隐式等待 implicitly_wait()
    • 隐式等待和强制等待的区别
      • 隐式等待(Implicit Wait)
      • 强制等待(Hardcoded Wait 或 Forced Wait)
  • 显示等待 WebDriverWait(driver,sec).until(functions)
      • 优点
      • 缺点
  • 显示等待和隐式等待的区别
      • 显示等待(Explicit Wait)
      • 隐式等待(Implicit Wait)
      • 总结
  • 隐式等待和显示等待混用

自动化测试的时候,我们代码的速度是比网页渲染的速度要快的多,如果我们代码都执行完了,网页还没有渲染好的话,就会出现一些问题,这个时候我们就得等待,等待网页渲染完毕之后才能进行交互:

一个例子

我们在百度搜索“老番茄”,然后点击他的百度百科:
在这里插入图片描述

import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from webdriver_manager.firefox import GeckoDriverManager

FireFoxIns = GeckoDriverManager().install()

driver = webdriver.Firefox(service=Service(FireFoxIns))

driver.get("https://www.baidu.com/")
time.sleep(3)

driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("老番茄")
driver.find_element(By.CSS_SELECTOR,"#su").click()

driver.find_element(By.CSS_SELECTOR,".pc-tag_2Nde8")


driver.quit()

然后代码会报错:
在这里插入图片描述这是因为,我们代码执行的速度太快了网页还没有渲染完,这个时候自然也找不到百度百科的词条。

此时,我们可以在点击之后休眠3秒:
在这里插入图片描述这个时候就没问题,因为网页已经渲染完了,这个时候百度百科的词条自然也就可以找得到了。这次成功的原因是,我么在点击之后等待了3秒,这个时候网页已经渲染好了。所以,适当的等待可以让网页有充分的时间去渲染,接下来我们要学习三种等待方式:

强制等待

强制等待或硬编码等待的方式。这种方式通过使用编程语言提供的睡眠函数来实现,比如 Python 的 time.sleep() 函数。强制等待会暂停脚本执行一个指定的时间长度,不论在这段时间内元素是否变得可用

强制等待是最简单但也可能是最不推荐的一种等待方式,因为它并不智能,也不考虑实际的页面加载状态或元素就绪情况。它只是简单地暂停测试脚本一段固定的时间,这可能会导致测试时间不必要的延长,并且在不同的网络环境或设备上表现不稳定。

使用示例:

import time

# 打开浏览器并导航到目标网页
driver.get('http://example.com')

# 强制等待5秒
time.sleep(5)

# 继续执行后续操作...

为什么不推荐使用强制等待?

  • 效率低下:即使元素在很短的时间内就已经可用,强制等待也会按照设定的时间长度进行等待,浪费时间。
  • 不可靠性:如果等待的时间不够长,可能导致元素还没准备好就被尝试访问;如果太长,则会无谓地增加测试时间。
  • 维护成本高:每当页面加载时间变化时,都需要调整这些硬编码的等待时间。

更好的选择

通常情况下,应该优先使用显式等待或 Fluent Wait 来处理动态内容,因为它们可以根据具体的条件来决定何时继续执行测试脚本,从而提供更可靠和高效的解决方案。

如果你确实需要在一个特定的位置添加短暂的停顿,比如为了让人眼观察某个动作的效果,可以考虑使用较短的强制等待。但在自动化测试中,应尽量避免使用强制等待,转而采用更加智能的等待策略。

隐式等待 implicitly_wait()

在 Selenium WebDriver 中,主要提供了三种类型的等待机制来同步测试脚本与网页加载行为:

  1. 隐式等待(Implicit Wait)
    隐式等待是全局设置的,它告诉 WebDriver 在尝试查找元素时,如果元素没有立即出现,则等待一段时间再抛出 NoSuchElementException。一旦设置了隐式等待,它将应用于所有后续的元素定位调用。
   from selenium import webdriver

   driver = webdriver.Chrome()
   driver.implicitly_wait(10)  # 等待最长10秒

隐式等待和强制等待的区别

隐式等待(Implicit Wait)和强制等待(Hardcoded Wait 或 Forced Wait)是两种不同的等待机制,它们在 Selenium WebDriver 中用于处理元素加载的时间问题。以下是两者的主要区别:

隐式等待(Implicit Wait)

  1. 智能等待:隐式等待是一种全局设置,它告诉 WebDriver 在查找元素时,如果元素没有立即出现,则等待一段时间再抛出 NoSuchElementException。在这段时间内,WebDriver 会定期轮询 DOM 查找元素。
  1. 适用范围:一旦设置了隐式等待,它将应用于所有后续的元素定位调用。这意味着对于每个找不到的元素,WebDriver 都会等待设定的时间。
  1. 灵活性:隐式等待可以根据页面的实际加载情况自动调整,而不需要为每个元素单独编写等待逻辑。
  1. 代码简洁性:只需要一行代码就可以为整个测试脚本设置隐式等待,简化了代码结构。
  1. 性能影响:虽然隐式等待可以提高测试的稳定性,但在某些情况下可能会导致测试执行时间延长,特别是当页面上的许多元素都需要等待的时候。
  1. 实现方式
   driver.implicitly_wait(10)  # 等待最长10秒

强制等待(Hardcoded Wait 或 Forced Wait)

  1. 固定等待:强制等待使用编程语言提供的睡眠函数(如 Python 的 time.sleep()),来暂停脚本执行一个指定的时间长度,不论在这段时间内元素是否变得可用。
  1. 非智能:强制等待不会根据元素的状态或页面加载情况作出反应,它只是简单地暂停测试脚本一段固定的时间。
  1. 适用范围:每次需要暂停时都必须显式地调用睡眠函数,并且只对当前行代码生效。
  1. 缺乏灵活性:由于它是基于固定时间的,因此不能适应不同环境下的页面加载速度变化。
  1. 代码冗余:如果多个地方需要等待,那么就需要在每一处都插入相应的睡眠语句,增加了代码的冗余度。
  1. 性能影响:即使元素已经准备好,强制等待也会按照设定的时间长度进行等待,这可能导致不必要的延迟,尤其是在快速网络环境下。
  1. 实现方式
   import time
   
   time.sleep(5)  # 暂停5秒
  • 推荐使用隐式等待,因为它更智能、更灵活,能够根据实际情况自动调整,避免了硬编码等待带来的低效率和不可预测性。
  • 尽量避免使用强制等待,除非你确实需要在特定的位置添加短暂的停顿,比如为了让人眼观察某个动作的效果。但在自动化测试中,应优先考虑使用隐式等待或显式等待等更智能的等待策略。

显示等待 WebDriverWait(driver,sec).until(functions)

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from webdriver_manager.firefox import GeckoDriverManager

FireFoxIns = GeckoDriverManager().install()

driver = webdriver.Firefox(service=Service(FireFoxIns))

try:
    # 打开百度首页
    driver.get("https://www.baidu.com/")

    # 创建一个 WebDriverWait 实例,设置最大等待时间为10秒
    wait = WebDriverWait(driver, 10)

    # 等待搜索框出现并输入搜索关键词
    search_box = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, "#kw")))
    search_box.send_keys("老番茄")

    # 等待搜索按钮出现并点击它
    search_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#su")))
    search_button.click()

    # 等待搜索结果中的特定元素出现
    result_element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".pc-tag_2Nde8")))

finally:
    # 完成后关闭浏览器
    driver.quit()

下面是一些方法

方法说明
title_is(title)检查页面标题是否等于指定的期望值。
title_contains(partial_title)检查页面标题是否包含指定的区分大小写的子字符串。
visibility_of_element_located(locator)检查元素是否存在于页面的DOM中并且是可见的。定位器用于指定要查找的元素。
presence_of_element_located(locator)检查元素是否存在于页面的DOM中。定位器用于指定要查找的元素。
visibility_of(element)检查已知存在于页面DOM上的元素是否可见。需要传入一个已经找到的元素对象。
alert_is_present()检查是否有警告框(Alert)出现。

优点

  • 智能等待:可以根据页面加载和元素状态动态调整等待时间。
  • 灵活性:可以自定义显示等待的条件,操作更加灵活。

缺点

  • 写法复杂:相较于隐式等待和强制等待,代码编写较为复杂,需要为每个特定条件设置等待逻辑。

显示等待和隐式等待的区别

显示等待(Explicit Wait)和隐式等待(Implicit Wait)是 Selenium WebDriver 中用于处理元素加载时间的两种不同机制。它们在实现方式、应用范围以及对测试稳定性的影响上都有显著的区别。以下是两者的主要区别:

显示等待(Explicit Wait)

  1. 智能且灵活
  • 显示等待允许你为每个元素或条件设置单独的等待时间,并且只在特定条件满足时继续执行脚本。
  • 它们可以更精确地控制等待逻辑,从而提高测试的稳定性和效率。
  1. 自定义等待条件
  • 使用 WebDriverWaitexpected_conditions,你可以定义非常具体的等待条件,如元素是否可见、可点击等。
  1. 局部应用
  • 显示等待仅应用于指定的元素查找操作,不会影响整个 WebDriver 实例的行为。
  1. 代码复杂度较高
  • 由于需要为每个等待条件编写相应的逻辑,因此代码会相对复杂一些。
  1. 性能优化
  • 显示等待可以在找到目标元素后立即结束等待,避免不必要的长时间等待,提高了测试速度。
  1. 实现示例
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    wait = WebDriverWait(driver, 10)
    element = wait.until(EC.presence_of_element_located((By.ID, 'myDynamicElement')))
    

隐式等待(Implicit Wait)

  1. 全局设置
  • 隐式等待是一次性设置给 WebDriver 实例的,它会影响所有后续的元素查找操作。
  1. 简单直接
  • 设置隐式等待只需要一行代码,易于理解和使用。
  1. 固定等待时间
  • 如果在设定的时间内没有找到元素,才会抛出异常;即使元素已经出现也会等到设定的时间结束,这可能导致不必要的延迟。
  1. 适用于所有元素查找
  • 隐式等待对所有元素查找都生效,无法针对单个元素进行定制化等待。
  1. 可能降低测试效率
  • 当页面上的许多元素都需要等待时,可能会导致测试执行时间延长。
  1. 实现示例
    driver.implicitly_wait(10)  # 等待最长10秒
    

总结

  • 推荐使用显示等待,因为它可以根据实际情况自动调整,提供更高的灵活性和更精准的控制,有助于创建更加稳定和高效的自动化测试。
  • 尽量避免混合使用显式等待和隐式等待,因为它们的组合可能会导致不可预测的行为。通常建议选择一种等待策略并坚持使用,以保持测试的一致性和可靠性。

隐式等待和显示等待混用

我们这里混用隐式等待和显示等待,看看最后等待的时间是不是20s:

try:
    # 打开百度首页
    driver.get("https://www.baidu.com/")

    # 设置隐式等待时间为10秒
    driver.implicitly_wait(10)

    # 创建一个 WebDriverWait 实例,设置最大等待时间为10秒
    wait = WebDriverWait(driver,10)
    start = time.time()

    # 输入搜索关键词并点击搜索按钮
    search_box = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR,"#kw")))
    search_box.send_keys("老番茄")
    # driver.find_element(By.CSS_SELECTOR, "#kw").send_keys("老番茄")

    search_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#su")))
    # driver.find_element(By.CSS_SELECTOR, "#su").click()
    search_button.click()

    # 尝试查找特定的元素(这里假设是搜索结果中的某个元素)
    result_element = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, ".pc-tag_2Nde81"))) # 故意写错,看时间
    driver.quit()

except:
    print("no such element")
    end = time.time()
    driver.quit()


print(end-start)

在这里插入图片描述
所以我们才说,不要混合隐式和显式等待,可能会导致不可预测的等待时间

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

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

相关文章

自动化之Ansible

一、Ansible介绍 Ansible是一个同时管理多个远程主机的软件(任何可以通过SSH协议登录的机器),因此Ansible可以管理 运程虚拟机、物理机,也可以是本地主机(linux、windows)。 Ansible通过SSH协议实现 管理节点、远程节点的通信。 只要是能够SSH登录的主机…

算法(蓝桥杯)贪心算法4——拦截导弹的系统数量求解

题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。 假设某天雷达捕捉到敌国的导弹来袭。由于该系统还在试用…

一些常见的Java面试题及其答案

Java基础 1. Java中的基本数据类型有哪些? 答案:Java中的基本数据类型包括整数类型(byte、short、int、long)、浮点类型(float、double)、字符类型(char)和布尔类型(boo…

初学stm32 --- CAN

目录 CAN介绍 CAN总线拓扑图 CAN总线特点 CAN应用场景 CAN物理层 CAN收发器芯片介绍 CAN协议层 数据帧介绍 CAN位时序介绍 数据同步过程 硬件同步 再同步 CAN总线仲裁 STM32 CAN控制器介绍 CAN控制器模式 CAN控制器模式 CAN控制器框图 发送处理 接收处理 接收过…

Golang笔记——协程同步

大家好,这里是Good Note,关注 公主号:Goodnote,专栏文章私信限时Free。本文详细介绍Golang的协程同步的实现和应用场景。 文章目录 协程同步是什么?为什么需要协程同步?常见的协程同步机制互斥锁&#xff0…

Visual Studio Community 2022(VS2022)安装方法

废话不多说直接上图: 直接上步骤: 1,首先可以下载安装一个Visual Studio安装器,叫做Visual Studio installer。这个安装文件很小,很快就安装完成了。 2,打开Visual Studio installer 小软件 3&#xff0c…

目标检测新视野 | YOLO、SSD与Faster R-CNN三大目标检测模型深度对比分析

目录 引言 YOLO系列 网络结构 多尺度检测 损失函数 关键特性 SSD 锚框设计 损失函数 关键特性 Faster R-CNN 区域建议网络(RPN) 两阶段检测器 损失函数 差异分析 共同特点 基于深度学习 目标框预测 损失函数优化 支持多类别检测 应…

mac intel芯片下载安卓模拟器

一、调研 目前主流两个模拟器: 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu?” q&a🔗:https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…

发送dubbo接口

史上最强,Jmeter接口测试-dubbo接口实战(超级详细)_jmeter调用dubbo接口-CSDN博客 干货分享:Dubbo接口及测试总结~ 谁说dubbo接口只能Java调用,我用Python也能轻松搞定 telnet xxx.xxx.xxx.xxx 端口号 再回车显示dub…

Leetcode 91. 解码方法 动态规划

原题链接&#xff1a;Leetcode 91. 解码方法 自己写的代码&#xff1a; class Solution { public:int numDecodings(string s) {int ns.size();vector<int> dp(n,1);if(s[n-1]0) dp[n-1]0;for(int in-2;i>0;i--){if(s[i]!0){string ts.substr(i,2);int tmpatoi(t.c…

SpringBoot源码解析(七):应用上下文结构体系

SpringBoot源码系列文章 SpringBoot源码解析(一)&#xff1a;SpringApplication构造方法 SpringBoot源码解析(二)&#xff1a;引导上下文DefaultBootstrapContext SpringBoot源码解析(三)&#xff1a;启动开始阶段 SpringBoot源码解析(四)&#xff1a;解析应用参数args Sp…

SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现

SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现 目录 SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长短期记忆网络多特征分类预测Matlab实现分类效果基本描述程序设计参考资料 分类效果 基本描述 SCSSA-BiLSTM基于改进麻雀搜索算法优化双向长…

XML在线格式化 - 加菲工具

XML在线格式化 打开网站 加菲工具 选择“XML 在线格式化” 输入XML&#xff0c;点击左上角的“格式化”按钮 得到格式化后的结果

树莓派5--系统问题汇总

前言&#xff1a; 该文章是我在使用树莓派5时所遇到的问题以及解决方案&#xff0c;希望对遇到相同问题的能够有所帮助。我的树莓派系统版本为&#xff1a;Pi-OS-ROS_2024_09_29 注意&#xff1a;如果没有什么需求千万不要更新树莓派中任何软件或者系统&#xff0c;除非你真的…

C#学习笔记 --- 基础补充

1.operator 运算符重载&#xff1a;使自定义类可以当做操作数一样进行使用。规则自己定。 2.partial 分部类&#xff1a; 同名方法写在不同位置&#xff0c;可以当成一个类使用。 3.索引器&#xff1a;使自定义类可以像数组一样通过索引值 访问到对应的数据。 4.params 数…

【2024年华为OD机试】 (C卷,100分)- 免单统计(Java JS PythonC/C++)

一、问题描述 题目描述 华为商城举办了一个促销活动&#xff0c;如果某顾客是某一秒内最早时刻下单的顾客&#xff08;可能是多个人&#xff09;&#xff0c;则可以获取免单。 请你编程计算有多少顾客可以获取免单。 输入描述 输入为 n 行数据&#xff0c;每一行表示一位顾…

python中数据可视化库(Matplotlib)

python中数据可视化库&#xff08;Matplotlib&#xff09; 安装 Matplotlib基本使用绘图类型示例散点图 (Scatter Plot)柱状图 (Bar Chart)饼图 (Pie Chart)直方图 (Histogram) 自定义图表样式多面板图表 (Subplots)3D 图表 Matplotlib 是 Python 中一个非常流行的绘图库&#…

某国际大型超市电商销售数据分析和可视化

完整源码项目包获取→点击文章末尾名片&#xff01; 本作品将从人、货、场三个维度&#xff0c;即客户维度、产品维度、区域维度&#xff08;补充时间维度与其他维度&#xff09;对某国际大型超市的销售情况进行数据分析和可视化报告展示&#xff0c;从而为该超市在弄清用户消费…

DETR论文阅读

1. 动机 传统的目标检测任务需要大量的人工先验知识&#xff0c;例如预定义的先验anchor&#xff0c;NMS后处理策略等。这些人工先验知识引入了很多人为因素&#xff0c;且较难处理。如果能够端到端到直接生成目标检测结果&#xff0c;将会使问题变得很优雅。 2. 主要贡献 提…

工业视觉2-相机选型

工业视觉2-相机选型 一、按芯片类型二、按传感器结构特征三、按扫描方式四、按分辨率大小五、按输出信号六、按输出色彩接口类型 这张图片对工业相机的分类方式进行了总结&#xff0c;具体如下&#xff1a; 一、按芯片类型 CCD相机&#xff1a;采用电荷耦合器件&#xff08;CC…