当前位置: 首页 > news >正文

Selenium自动化中的 三大时间等待

​在使用 Selenium 进行自动化测试时,合理的等待策略对于确保脚本的稳定性和可靠性至关重要。Selenium 提供了三种主要的等待方式:强制等待隐式等待显式等待

在Selenium自动化测试中,时间等待是处理网页元素加载延迟的关键机制。由于网页可能是动态加载的(如AJAX请求),Selenium需要等待元素可用,否则会导致“元素不可见”或“找不到元素”等异常。时间等待的正确使用能提高测试脚本的稳定性和可靠性。

Selenium提供了三种主要等待方式:

  1. 隐式等待(Implicit Wait)
  2. 显式等待(Explicit Wait)
  3. 线程睡眠(Thread.sleep)

下面逐一分析它们的原理、用法和适用场景。


1. 隐式等待(Implicit Wait)
  • 定义:隐式等待是全局设置,告诉WebDriver在查找元素时等待一段固定时间。如果元素未立即出现,Selenium会轮询DOM,直到元素出现或超时。
  • 代码示例(Java):
  • WebDriver driver = new ChromeDriver();
    driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
    driver.findElement(By.id("example")); // 最多等待10秒

  • 优点
    • 设置一次,全局生效,适合简单的测试场景。
    • 减少显式编写等待代码的工作量。
  • 缺点
    • 缺乏灵活性,无法针对特定条件等待(如元素可点击)。
    • 如果超时时间设置过长,可能拖慢测试执行速度。例如,研究发现,在复杂页面中,隐式等待可能导致测试时间增加50%以上。
  • 适用场景:静态页面或元素加载时间较一致的场景。

2. 显式等待(Explicit Wait)
  • 定义:显式等待通过WebDriverWait类实现,允许用户定义特定条件(如元素可见、可点击)并设置最大等待时间。条件满足后立即继续执行,否则超时抛出异常。
  • 代码示例(Java):

    WebDriver driver = new ChromeDriver(); WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("example")));

  • 常用条件(ExpectedConditions类):
    • visibilityOfElementLocated:元素可见。
    • elementToBeClickable:元素可点击。
    • presenceOfElementLocated:元素存在于DOM中。
  • 优点
    • 灵活性高,可针对具体元素或条件等待。
    • 效率更高,避免不必要的延迟。例如,元素在3秒内出现就不用等满10秒。
    • 社区反馈显示,显式等待在动态网页(如React、Vue应用)中稳定性提升约30%。
  • 缺点
    • 代码量增加,需要为每个关键操作编写等待逻辑。
  • 适用场景:动态加载页面、AJAX请求频繁的场景。

3. 线程睡眠(Thread.sleep)
  • 定义:一种硬编码的静态等待,直接暂停线程执行固定时间,不检查任何条件。
  • 代码示例(Java):
    WebDriver driver = new ChromeDriver(); 
    Thread.sleep(5000); // 暂停5秒 
    driver.findElement(By.id("example"));

  • 优点
    • 简单粗暴,易于实现。
  • 缺点
    • 不灵活,无法动态适应页面加载时间。
    • 时间设置过短可能导致失败,过长则浪费时间。例如,5秒睡眠可能比实际加载时间多出4秒,降低效率。
    • 被视为“反模式”,自动化专家普遍不推荐在生产环境中使用。
  • 适用场景:调试或临时解决,无法使用其他等待方式的极端情况。

三者对比
等待类型灵活性效率使用场景推荐指数
隐式等待中等静态页面★★★☆☆
显式等待动态页面、复杂交互★★★★★
线程睡眠调试、临时使用★☆☆☆☆

如何选择合适的等待方式
  1. 优先显式等待
    • 如果页面元素加载时间不确定,或需要特定条件(如按钮可点击),显式等待是最佳选择。
    • 示例:等待登录按钮可点击后输入凭据。
  2. 辅助隐式等待
    • 在全局设置中加入短时隐式等待(如5秒),结合显式等待处理特殊情况。
    • 注意:避免隐式和显式等待混用,可能导致超时时间叠加,延长测试时间。
  3. 避免线程睡眠
    • 除非万不得已(如调试),尽量不使用Thread.sleep,因为它会显著降低测试效率和可维护性。

在 Selenium 中,时间等待指在测试用例中等待某个操作完成或某个事件发生的时间。Selenium 中提供了多种方式来进行时间等待,包括使用 ExpectedConditions 中的 presence_of_element_located 和 visibility_of_element_located 方法等待元素可见或不可见,以及使用 until 和 when 等待某个特定操作完成或某个特定事件发生。

下面是一些示例代码: 

1. 使用 presence_of_element_located 方法等待某个元素加载

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


# 设置浏览器驱动

browser = webdriver.Chrome()


# 打开网站

browser.get('https://baidu.com')


# 等待某个元素加载

element = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, 'myelement')))

2. 使用 until 等待某个特定操作完成

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



# 设置浏览器驱动

browser = webdriver.Chrome()


# 打开网站

browser.get('https://baidu.com')


# 等待页面中的表单加载完成

element = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, 'myform')))


# 查找元素并提交表单

element.find_element_by_id('my-input').send_keys('my-value')

element.find_element_by_id('my-submit').click()

3. 使用 when 等待某个特定事件发生

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



# 设置浏览器驱动

browser = webdriver.Chrome()


# 打开网站

browser.get('https://baidu.com')

# 等待页面中的表单提交完成

element = WebDriverWait(browser, 10).until(EC.presence_of_element_located((By.ID, 'myform')))


# 等待表单提交完成事件触发

element.find_element_by_id('my-submit').click()

需要注意的是:

时间等待的时间长度应该根据具体的测试用例来确定,并且应该尽可能地模拟真实用 户的行为,以保证测试用例更加准确和可靠。

4. 使用 ExpectedConditions.visibility_of_element_located 方法等待某个元素可见

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



# 设置浏览器驱动

browser = webdriver.Chrome()


# 打开网站

browser.get('https://baidu.com')

# 等待某个元素可见

element = WebDriverWait(browser, 10).until(EC.visibility_of_element_located((By.ID, 'my-element')))

需要注意的是:

visibility_of_element_located 方法只能用于等待某个元素可见,而不能用于等待某个元素不可见

另外,visibility_of_element_located 方法可能会比其他方法消耗更多的时间,因为它会等待元素变为可见,而不是仅仅判断元素是否可见。因此,在使用该方法时需要根据具体情况进行调整

5. 使用 ExpectedConditions.title_contains 方法等待页面标题包含指定内容

from selenium import ebdriver

from selenium.webdriver.common.by import By

from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.support import expected_conditions as EC


# 设置浏览器驱动
browser = webdriver.Chrome()

# 打开网站
browser.get('https://baidu.com')

# 等待页面标题包含指定内容
element = WebDriverWait(browser, 10).until(EC.title_contains('My Web Page'))

需要注意的是:

title_contains 方法只能用于等待页面标题包含指定内容,而不能用于等待页面标题不包含指定内容

另外,title_contains 方法可能会比其他方法消耗更多的时间,因为它会等待页面标题完全包含指定内容,而不是仅仅判断页面标题是否包含指定内容。因此在使用该方法时需要根据具体情况进行调整。

如何选择合适的等待方式

  1. 优先显式等待
    • 如果页面元素加载时间不确定,或需要特定条件(如按钮可点击),显式等待是最佳选择。
    • 示例:等待登录按钮可点击后输入凭据。
  2. 辅助隐式等待
    • 在全局设置中加入短时隐式等待(如5秒),结合显式等待处理特殊情况。
    • 注意:避免隐式和显式等待混用,可能导致超时时间叠加,延长测试时间。
  3. 避免线程睡眠
    • 除非万不得已(如调试),尽量不使用Thread.sleep,因为它会显著降低测试效率和可维护性。

在实际应用中,建议根据具体需求选择合适的等待方式,或结合使用,以确保测试脚本的高效稳定运行。

结论

隐式等待可能隐藏潜在问题。例如,如果页面加载时间异常延长(如网络延迟),隐式等待会默默等待超时,而不会立即暴露问题。相比之下,显式等待可以通过自定义条件和日志记录,更快定位加载失败的原因。这在调试复杂Web应用时尤为重要。

Selenium中的时间等待是自动化测试的核心技术,直接影响脚本的稳定性和效率。显式等待因其灵活性和高效性,成为自动化专家的首选,尤其在动态网页测试中。隐式等待适合简单场景,但需谨慎设置超时时间以避免性能问题。而线程睡眠则应尽量避免,以保持测试脚本的健壮性。合理选择等待策略,能显著提升自动化测试的质量和速度。

如果你有具体场景想讨论,比如某个元素的等待问题,欢迎告诉我,我可以帮你优化代码!

http://www.dtcms.com/a/107280.html

相关文章:

  • gcc 链接顺序,静态库循环依赖问题
  • 「青牛科技」GC5849 12V三相无感正弦波电机驱动芯片
  • RISC-V debug专栏2 --- Debug Module(DM)
  • 在将asc文件导入maxent文件时出现for input string:“nan“
  • (kotlin) Android 13 高版本 图片选择、显示与裁剪功能实现
  • Docker容器部署Java项目的自动化脚本(Shell编写)
  • 动态规划练习题①
  • 蓝桥杯 web 灯的颜色变化(Dom操作及样式动态修改、浏览器解析顺序、定时器)
  • 计算机科学基础设施之数学:科研工具、资源与环境详介
  • qt.qpa.xcb: could not connect to display解决方法
  • Keil5烧录后STM32不自动运行?必须复位才能启动的终极解决方案
  • element-plus中,Upload上传组件的使用 + 后端处理
  • DMA在SPI和I2C通信中的应用详解
  • 解锁异步编程新姿势:CompletableFuture 深度探秘
  • java根据集合中对象的属性值大小生成排名
  • [NOIP 1999 提高组] 导弹拦截
  • C++ STL简单的几个容器
  • I²C总线高级特性与故障处理分析
  • 【leetcode100】每日温度
  • OpenCV 从入门到精通(day_04)
  • 面向对象
  • python实现简单fast-cgi服务,对接到nginx
  • 蓝桥云客 刷题统计
  • 持续集成与Jenkins安装使用教程
  • 分布式锁方案-Redisson
  • Linux命令-tar
  • 使用 MapReduce 进行高效数据清洗:从理论到实践
  • Linux内核中ARP协议的实现与dev_addr字段的作用
  • LabVIEW 调用 Python 函数
  • SAP-ABAP:ABAP `LEAVE LIST-PROCESSING` 深度解析