15-三种等待方式

目录

1.  强制等待

2. 隐式等待

3. 显式等待

4. 总结


1.  强制等待

  • 方法:sleep(seconds),seconds 等待时间,单位 秒 s
  • 说明:不管浏览器是否加载完了,程序都得等待3秒,不建议使用,严重影响执行速度
# -*- coding: utf-8 -*-
# @Time    : 2021/1/17
# @Author  : 大海

from selenium import webdriver
from time import sleep

driver = webdriver.Chrome()
driver.get('https://blog.youkuaiyun.com/IT_heima?spm=1001.2014.3001.5343')

sleep(2)  # 强制等待2秒再执行下一步
print(driver.current_url)
print(driver.title)

driver.close()

2. 隐式等待

  • 方法:implicitly_wait(time_to_wait) ,  time_to_wait 等待时间, 单位 秒 s
  • 说明:设置了一个最长等待时间,如果在规定时间内网页加载完成,则执行下一步,否则一直等到时间截止,然后执行下一步。此方法是全局性的,设置一次即可
  • 弊端:程序会一直等待整个页面加载完成,也就是一般情况下看到浏览器标签栏那个小圈不再转,才会执行下一步,但是页面的元素已加载完,js等未加载完,仍会等待
# -*- coding: utf-8 -*-
# @Time    : 2021/1/17
# @Author  : 大海

from selenium import webdriver

driver = webdriver.Chrome()
# 隐式等待,最长等20秒
driver.implicitly_wait(20)
driver.get('https://blog.youkuaiyun.com/IT_heima?spm=1001.2014.3001.5343')

print(driver.current_url)
print(driver.title)

driver.close()

3. 显式等待

     init方法:__init__(driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None)

  • driver :浏览器驱动。  
  • timeout :最长超时时间,默认以秒为单位。
  • poll_frequency :检测的间隔(步长)时间,默认为0.5S。
  • ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。

    unit方法:until( method, message='')

  • method:传入执行的方法
  • message:超时时的提示信息

    until_not方法:同until

  • 使用: WebDriverWait(driver, 超时时长, 调用频率, 忽略异常).until(可执行方法, 超时时返回的信息)
# -*- coding: utf-8 -*-
# @Time    : 2021/1/17
# @Author  : 大海

from selenium import webdriver
from selenium.common.exceptions import ElementNotVisibleException
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Chrome()
# 隐式等待,最长等20秒
driver.implicitly_wait(20)
driver.get('http://baidu.com')

print(driver.current_url)
print(driver.title)

# 每隔0.5s去查找元素 kw,超时时间为10s,返回WebElement对象
element = WebDriverWait(driver, 10).until(lambda x: x.find_element_by_id("kw"))
element.send_keys('selenium')

# 每隔1去查找元素 kw是否可见,超时时间为30s,返回结果为布尔值  
is_disappeared = WebDriverWait(driver, 30, 1, ElementNotVisibleException).until_not(
    lambda x: x.find_element_by_id("kw1").is_displayed())
print(is_disappeared)

# 错误用法   until() 第一个参数应该是方法,此处传入的是WebElement对象,所以不正确,可参照上面的写法
# WebDriverWait(driver, 10).until(driver.find_element_by_id('kw'))
driver.close()

4. 总结

  • sleep():强制等待n秒,影响程序执行速度
  • implicitly_wait():隐式等待,全局性,设置一次即可,针对的是整个页面是否加载完成
  • WebDriverWait():显示等待,针对单个元素判断,灵活
  • 隐式等待和显时等待同时使用时,超时时间取两者最长的

 

 

<think>我们正在讨论UI自动化测试中的三种等待方式:显式等待、隐式等待和强制等待。根据引用内容,我们可以总结如下: 1. **强制等待**:通过让线程休眠一段时间来实现等待,例如使用`time.sleep(10)`(Python)或`Thread.sleep(2000)`(Java)。这种方式简单但缺乏灵活性,因为它不考虑页面元素是否已经加载完成,而是固定等待一段时间。这可能导致测试时间过长(如果等待时间设置过长)或元素未加载完成就执行操作(如果等待时间不足)[^4]。 2. **隐式等待**:通过设置一个全局的等待时间,在查找元素时,如果元素没有立即出现,WebDriver会等待一段固定的时间(即隐式等待时间)直到元素出现。如果在规定时间内元素出现,则继续执行;否则抛出异常。隐式等待只需要设置一次,对整个WebDriver生命周期都有效。但是,它的缺点是会延长整个测试执行的时间,因为每次查找元素时都会等待,即使元素已经存在。另外,它不适用于等待元素的其他状态(如可点击、可见等)[^3][^5]。 3. **显式等待**:针对特定元素设置等待条件,直到满足某个条件(如元素可见、可点击等)或超过最大等待时间才继续执行。显式等待使用`WebDriverWait`和`expected_conditions`类,可以精确控制等待的条件,灵活性高。但是代码相对复杂一些[^1][^2]。 **区别总结**: - **强制等待**:固定时间等待,不灵活,效率低。 - **隐式等待**:全局设置,作用于所有元素查找,但只能等待元素存在,不能等待其他条件,且会增加整体测试时间。 - **显式等待**:针对特定元素和条件,灵活且精准,但代码编写相对复杂。 在实际应用中,通常推荐使用显式等待,因为它可以精确控制等待条件,提高测试的稳定性和效率。隐式等待可以作为辅助,而强制等待应尽量避免使用,除非在特定情况下(如等待非元素相关的操作,例如等待某个固定时间点的操作)[^1][^4][^5]。 **示例代码对比**: 强制等待Python): ```python import time time.sleep(5) # 强制等待5秒 ``` 隐式等待Python): ```python driver.implicitly_wait(10) # 隐式等待10秒 ``` 显式等待Python): ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By # 等待元素可见,最多10秒 element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, "myElement")) ) ``` 综上所述,强制等待简单但缺乏灵活性;隐式等待适用于一般情况,但对于复杂场景可能不够精准;显式等待最为灵活,可以根据具体需求进行定制,但代码相对复杂一些。在WEB UI自动化测试中,应根据实际情况选择合适的等待方式,以提高测试效率和稳定性[^1]。 §§相关问题§§ 1. 在什么情况下应该使用显式等待而不是隐式等待? 2. 如何设置一个同时使用隐式等待和显式等待的测试框架?它们会相互影响吗? 3. 显式等待中常用的条件有哪些?请举例说明。 4. 强制等待有哪些缺点?为什么应该尽量避免使用? 5. 如何优化测试脚本中的等待时间以提高测试效率?</think>### UI自动化测试中显式等待、隐式等待和强制等待的区别 在UI自动化测试中,等待机制是确保页面元素加载完成的关键技术。三种主要等待方式的区别如下: #### 1. **强制等待(Fixed Wait)** - **原理**:通过线程休眠固定时间(如`time.sleep(10)`)实现等待 - **特点**: - 简单易用,但缺乏灵活性 - 不考虑元素实际加载状态,固定等待指定时间 - 可能导致测试效率低下(等待时间过长)或失败(等待不足) - **适用场景**: - 简单页面或已知固定加载时间的操作 - 显式/隐式等待失效时的备选方案[^4] - **示例**: ```python time.sleep(5) # 强制等待5秒 ``` #### 2. **隐式等待(Implicit Wait)** - **原理**:设置全局等待时间(如`driver.implicitly_wait(30)`),作用于整个WebDriver生命周期 - **特点**: - 自动应用于所有元素查找操作 - 若元素提前出现则立即继续执行 - 会增加整体测试执行时间(每次查找都等待- 无法处理非元素查找操作(如JS执行) - **缺点**: - 可能让正常响应的测试变慢 - 无法指定具体条件(如元素可点击、可见等)[^3] - **示例**: ```python driver.implicitly_wait(10) # 全局隐式等待10秒 ``` #### 3. **显式等待(Explicit Wait)** - **原理**:针对特定元素设置自定义条件(如可点击/可见),配合超时时间 - **特点**: - 精准控制:可指定具体条件和元素 - 灵活性高:不同元素可设置不同等待条件 - 不增加无意义的等待时间 - 需额外编写等待代码,复杂度较高[^1][^2] - **常用条件**: - 元素可见性(`visibility_of_element_located`) - 元素可点击(`element_to_be_clickable`) - 元素存在(`presence_of_element_located`) - **示例**: ```python from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC element = WebDriverWait(driver, 15).until( EC.element_to_be_clickable((By.ID, "submitButton")) ) ``` ### 对比总结 | **特性** | 强制等待 | 隐式等待 | 显式等待 | |----------------|------------------|------------------------|------------------------| | 作用范围 | 单次等待 | 全局(所有元素查找) | 针对特定元素/条件 | | 灵活性 | 低 | 中 | 高 | | 执行效率 | 最低(固定等待) | 较低(全局等待) | 最高(按需等待) | | 代码复杂度 | 简单 | 简单(一行配置) | 复杂(需定义条件) | | 适用场景 | 简单临时方案 | 稳定且加载时间一致的页面 | 动态元素/复杂交互场景 | | 能否指定条件 | ❌ | ❌ | ✔️ | > **最佳实践建议**: > 优先使用显式等待处理关键交互元素;对稳定页面可辅以短时间隐式等待(如5秒);强制等待仅作为最后备选。三者可组合使用,但需注意隐式等待会增加显式等待的超时时间[^5]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习de测试小白

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值