自动化测试-三种等待的使用方式 (强制等待,显示等待,隐式等待)

✨✨✨学习的道路很枯燥,希望我们能并肩走下来!

编程真是一件很奇妙的东西。你只是浅尝辄止,那么只会觉得枯燥乏味,像对待任务似的应付它。但你如果深入探索,就会发现其中的奇妙,了解许多所不知道的原理。知识的力量让你沉醉,甘愿深陷其中并发现宝藏。



本文开始

1. 强制等待

使用方法:

Thread.sleep(3000);(单位是毫秒)

1)解决什么问题:在报错的元素操作之前添加等待
2)原理:强制线程等待,线程休眠一定时间
3)来源:Thread类中的静态方法,需要处理 InterruptedException
4)使用场景适合:调试时使用,临时性添加;代码部署环境时避免或者减少使用

    @Test
    public void waitImplicitlyWait() throws InterruptedException {
        webDriver.get("https://www.baidu.com/");
        Thread.sleep(3000);
        webDriver.findElement(By.xpath("//*[text()='个人中心']"));
    }

2. 隐式等待

使用方法:

  webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));

1)解决什么问题:难以确定元素加载的具体等待时间,针对于寻找元素的这个动作,使用隐式等待添加配置。
2)原理:在设置的等待时间内,轮询查找(默认0.5秒)元素是否出现,如果没出现就抛出异常,
3)来源:包:org.openqa.selenium
类结构:
=》WebDriver.Options 接口(通过 manage() 获取)
=》WebDriver.Timeouts 接口(通过 timeouts() 获取)
=》方法:implicitlyWait(Duration duration)
4)使用场景:难以确定元素加载的具体等待时间
5)特点:是全局等待,设置一个隐式等待会在全局等待,查看元素是否出现;能够查看全局dom元素;
6)缺点:元素可以找到,使用点击等页面交互操作,出现报错

原因:
1.页面元素加载是异步加载过程,通常html会先加载完成,js、css其后
2.元素存在与否是由HTML决定,元素的交互是由css或者js决定
3.隐式等待只关注元素能不能找到,不关注元素能否点击或者进行其他的页面交互操作
4.解决方案:使用显式等待

 @Test
    public void waitImplicitlyWait() throws InterruptedException {
        webDriver.get("https://www.baidu.com/");
        webDriver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
        webDriver.findElement(
            By.xpath("//*[@id=\"inspire\"]/div/nav/div[1]/div/div/div[8]/div/div[2]/div"));
    }

3. 显示等待

使用方法:WebDriverWait(driver实例, 最长等待时间).until(结束条件);

 WebElement element = new WebDriverWait(webDriver, Duration.ofSeconds(10))
                .until(ExpectedConditions.elementToBeClickable(
                        By.cssSelector("#success_btn")
                ));

1)解决什么问题:解决与页面元素交互操作,如:点击,输入等
2)原理:在最长等待时间内,是否满足结束条件;设定特定的等待条件,轮询等待操作,两者满足其一,显示等待就结束了;
3)来源:包:org.openqa.selenium.support.ui
核心类:
WebDriverWait - 显式等待的主要类 - 继承自 FluentWait< WebDriver >
ExpectedConditions - 预定义等待条件的工厂类
包含各种静态方法返回 ExpectedCondition 对象
Wait 接口 - 等待机制的基础接口
FluentWait 类 - 提供流畅API的等待实现
4)使用场景适合:解决特定条件下的等待问题,比如点击等交互性行为

@Test
    public void waitWebDriverWait() {
        //进入页面,点击消息提醒按钮
        webDriver.get("www.baidu.com");
        WebElement element = new WebDriverWait(webDriver, Duration.ofSeconds(10))
                .until(ExpectedConditions.elementToBeClickable(
                        By.id("success_btn");
                ));
        element.click();
    }

【注】
1)优先使用显式等待:WebDriverWait + ExpectedConditions
2)辅助使用隐式等待:设置全局基础超时
3)避免使用强制等待:Thread.sleep() 应作为最后手段
4)Java 8+:使用 Duration 类而不是具体的秒数值

总结

✨✨✨各位读友,本篇分享到内容是否更好的让你理解了显示等待和隐式等待使用,如果对你有帮助给个👍赞鼓励一下吧!!
🎉🎉🎉世上没有绝望的处境,只有对处境绝望的人。
🎉🎉🎉一遇挫折就灰心丧气的人,永远是个失败者。而一向努力奋斗,坚韧不拔的人会走向成功。
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

<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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值