掌握Selenium 自动化测试的人员都知道Selenium的等待使用场景至关重要,这些等待对于测试自动化稳定性不可或缺的一部分,因为它们确保与 Web 元素的同步交互,从而能够在不同的加载时间和动态页面更改中准确执行测试脚本。
本文将深入探讨 Selenium 等待并说明测试人员如何使用 Selenium 的等待功能。我们将介绍所有 Selenium 等待:隐式等待、显式等待和Fluent Wait。
为什么我们需要 Selenium 等待?
测试自动化的主要挑战是确保应用程序经过合适的方式以按预期执行特定的Selenium命令。UI测试自动化最常见的问题之一是要操作对象不存在。在这种情况下, selenium 执行的时候,页面上需要操作的元素不存在,就会出现执行操作失败,这也是测试结果不可靠的主要原因之一。
这种问题的原因取决于很多方面,例如网络速度、内容大小以及所使用的前端技术/框架。例如由于文档对象模型(也称为 DOM)的动态更新,Vue、React 或 Angular 等Javascript 框架需要一些时间来加载网页上的不同对象。
如果没有适当的等待机制,自动化测试往往会产生不一致的结果。缺乏稳定可靠的测试执行会增加自动化开发人员的投入时间,最终降低他们的效率。为了解决这个问题,Selenium等待就派上用场,用来解决一些元素出现时机不可控的场景。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:691998057【暗号:csdn999】
我们可以使用Thread.sleep()吗?
Thread.sleep()是一个线程停止运行语句,它可以在指定的时间内停止程序的执行。通过使用它,我们可以实现可靠的自动化测试脚本所需的等待,但它带来了一些阻碍其使用的问题,如下所示:
-
• 使测试脚本效率低下:无论任何情况,Thread.sleep()方法的调用都会等待指定的时间。这种静态行为会导致执行测试脚本时出现不必要的延迟。无论测试时元素的加载时间如何,脚本都会等待静态持续时间并增加测试执行时间。
-
• 需要在每个 Selenium 命令后显式添加:使用Thread.sleep()在测试脚本中添加等待时,需要在所有位置添加等待,即使在访问网页的任何元素之前需要持续等待。这使得测试脚本随着时间的推移很难维护。
-
• 停止时间多少:在不同场景需要使用多长时间是我们一个难题。
考虑到这些原因,我们需要找到更好的解决方案。下面让我们看看 Selenium 等待、它们的不同类型,以及它们如何解决 Web 自动化中的特定等待问题。
Selenium 等待类型
Selenium提供了三种类型来处理不同的场景并增强自动化测试的可靠性。
-
• 隐式等待– Selenium 中的隐式等待是一种全局等待,适用于脚本中的所有元素。它设置任何元素在交互之前变得可用的最长等待时间。如果该元素在指定时间内出现,则脚本继续,否则会引发TimeoutException。
-
• 显式等待– Selenium 中的显式等待是一种更细粒度的方法,允许您等待特定条件或元素。显式等待应用于各个元素,并提供更好的控制。通常使用WebDriverWait类和预期条件来定义自定义等待条件。显式等待对于有效处理具有不同加载时间的动态 Web 元素非常有用。
-
• Fluent Wait – Selenium 中的 Fluent Wait 允许用户以自定义的检查条件频率来等待满足特定条件。当处理可能需要不同时间来加载或更改状态的元素时,流畅的等待特别有用。此等待是使FluentWait类创建的,并配置了超时、轮询频率和要忽略的异常等选项。
Selenium 中的隐式等待
在 Selenium 中,隐式等待是一种指示 WebDriver在抛出异常之前等待一定时间的机制。它全局应用于整个脚本,其主要目的是等待元素出现在 DOM(文档对象模型)中,然后再对它们执行操作。
当设置隐式等待时,WebDriver 将在指定的时间内重复轮询 DOM,直到找到元素或超时期限到期。如果在指定时间内找到该元素,WebDriver 将继续执行脚本中的下一步。如果在隐式等待期间未找到该元素,则会引发异常。
默认情况下,隐式等待的值设置为零,这意味着如果未找到该元素,它将立即返回错误。要在脚本中使用隐式等待,使用以下语法:
driver.implicitly_wait(10)
在初始化 WebDriver 后立即在脚本中设置隐式等待。这为所有后续交互设置了统一的等待时间。
Selenium 中的显式等待
Selenium 中的显式等待是一种技术,其中 WebDriver 被指示等待满足特定条件,然后再继续执行脚本中的后续步骤。与全局应用并等待指定时间量的元素出现的隐式等待不同,显式等待侧重于单个元素的特定条件。
通过显式等待,等待某些条件,例如元素的存在、元素的可见性或可以配置元素处于特定状态的特定属性,然后再继续,使用以下语法:
wait = WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
element =wait.until(EC.presence_of_element_located((By.ID,"")),message="")
driver:浏览器驱动
timeout:最长超时时间,默认以秒为单位
poll_frequency:检测的间隔步长,默认为0.5s
ignored_exceptions:超时后的抛出的异常信息,默认抛出 NoSuchElementExeception 异常。
与until()或者until_not()方法结合使用
WebDriverWait(driver,10).until(method,message="")
调用该方法提供的驱动程序作为参数,直到返回值为True
预期条件的类型
显式等待提供了一种在执行测试脚本之前等待满足某些条件或因无法满足该条件而引发异常的方法。这是在 Selenium 的ExpectedConditions类的帮助下完成的。可以使用多个条件进行等待,如下所示:
-
• 元素可见性: visibilityOfElementLocated()条件确保元素存在于 DOM 中并且在页面上可见。
-
• 元素可点击性: elementToBeClickable()条件对于元素需要交互(例如单击按钮)的场景至关重要。
-
• 元素的存在: presenceOfElementLocated()条件等待 DOM 中至少存在一个元素。
-
• 元素的不可见性: invisibilityOfElementLocated()条件等待指定元素不可见。
-
更多的我们可以浏览ExpectedConditions类的官方文档了解更多信息。
Selenium 中的流畅等待
在 Selenium 中,Fluent wait 提供了一种更灵活的方法,可以在继续执行脚本之前等待满足某些条件。它实现了 Wait 接口,并允许您定义轮询频率和等待期间要忽略的异常。
流畅的等待命令是使用Java中的Selenium FluentWait类实现的。FluentWait 的关键特性是其“流畅”或可链接语法,您可以在链中应用不同的条件和配置。
Wait<WebDriver> fluentWait = new FluentWait<WebDriver>(driver)
.withTimeout(60, SECONDS) // 自定义等待的总时间
.pollingEvery(2, SECONDS) // 自定义轮询频率
.ignoring(NoSuchElementException.class); // 自定义要忽略的异常
WebElement foo = fluentWait.until(new Function<WebDriver, WebElement>() {
public WebElement apply(WebDriver driver) // 自定义等待条件
{
return driver.findElement(By.id("kw"));
}
});
如这段代码片段所示,在实例化等待对象时,我们可以提及等待持续时间、轮询持续时间以及此等待可以忽略的异常。流畅等待的实例化后,可以在访问 Web 元素时使用它,方法是在 wait 的直到方法中传入一个Function 。
Selenium 几种等待对比
在 Selenium 中选择正确的等待策略对于顺利实现自动化至关重要。让我们比较一下隐式等待、显式等待和流畅等待,以便于理解。
特征 | 隐式等待 | 显式等待 | 流畅等待 |
范围 | 普遍影响网站上的所有元素。 | 可以单独应用于特定元素。 | 允许针对特定元素量身定制个性化等待策略。 |
支持复杂条件 | 最适合对元素是否存在进行基本检查。 | 通过显式条件支持各种条件,例如可见性或可点击性。 | 通过适应用户定义的特定条件提供高度的灵活性。 |
配置 | 全局设置一次,以便在整个网站上保持一致的应用程序。 | 可针对不同元素独立配置,提供细致入微的控制。 | 类似于显式等待,但引入了额外的配置以提高精度。 |
使用案例 | 非常适合具有一致加载时间的简单场景。 | 非常适合处理复杂的情况,特别是当加载行为不可预测时。 | 在以变化和可变加载时间为特征的动态场景中有效。 |
等待时间配置 | 全局设置,确保整个站点的等待时间统一。 | 可以针对特定元素或场景单独配置,从而实现精细控制。 | 可根据每个元素进行定制,从而实现定制的等待时间。 |
轮询间隔配置 | 检查之间以 500 ms的固定默认间隔运行。 | 允许用户设置条件检查的频率,默认为 500ms 间隔。 | 遵循与显式等待相同的轮询间隔配置。 |
忽略异常 | 缺乏选择性忽略异常的能力。 | 允许在等待期间选择性地抑制特定错误。 | 在异常处理方面与显式等待保持一致。 |
灵活性 | 相对简单,自定义选项有限。 | 提供增强的适应性,适应各种等待场景。 | 适应性强,特别有利于特定和微妙的情况。 |
可读性和表达性 | 由于其全局应用,本质上很通用,提供的信息不太详细。 | 表现出更大的表现力,特别是在使用不同的条件时。 | 通过流畅的 API 展现出高表达力,有助于提高代码清晰度。 |
使用 Selenium 等待时要避免的常见错误
掌握Selenium等待至关重要,但避免常见错误也同样重要。使用 Selenium 等待时要避免的一些问题:
-
• 过度依赖隐式等待: 仅依赖隐式等待可能会导致同步问题。用 显示等待 或 Fluent Waits 来补充它们,以获得在动态 Web 场景中更好的适应性。
-
• 等待时间不足: 通过设置合理的等待时间来避免脚本失败。元素可能需要更长的时间来加载;合适的等待时间可以增强测试的稳健性。
-
• 忽略 ExpectedConditions: 通过显式且流畅的等待来利用 ExpectedConditions 的强大功能。忽略这些条件可能会导致脚本的适应性和健壮性较差。
• 异常处理不当: 在 Fluent Waits 中正确异常处理。忽视它可能会忽略关键错误,从而影响脚本的可靠性,通过细致的异常管理确保有效的调试。
-
• 忽略动态条件: 使您的等待适应网页的动态特性。忽视这一点可能会导致脆弱的脚本容易失败,Selenium 等待在动态场景中大放异彩。
-
• 忘记重置隐式等待: 全局修改隐式等待后,记得重置它。忘记这样做可能会影响脚本的其他部分,保持一致性至关重要。
-
• 等待策略使用混乱: 在整个测试套件中保持一致的等待策略,隐式、显式和流畅等待的混合可能会导致混乱和脚本不稳定。
总结
如果要熟练使用Selenium WebDriver进行UI自动化,必须要需要掌握 Selenium 等待,这是一项保证测试脚本执行稳定性重要技能。在我们的探索中,我们发现了在网页异步领域中 Selenium 等待的必要性,其中元素加载不一致的现象普遍存在。虽然 Thread.sleep() 提供静态解决方案,但 Selenium 等待会动态适应,优化不同加载时间的脚本执行。
我们深入研究了关键的 Selenium等待——隐式、显式和流畅——每一个都是针对特定场景量身定制的。隐式等待具有全局适用性,适合一致的加载时间。显式等待提供特定于元素的精度,非常适合动态页面。Fluent Wait 具有很强的适应性和表现力,在不可预测的环境中表现出色。
我们强调了要避免的常见错误,强调需要采取平衡的方法。总之,Selenium等待对于有效的Web 自动化是不可或缺的一部分。
下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!
最后: 可以在公众号:程序员小濠 ! 免费领取一份216页软件测试工程师面试宝典文档资料。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一键三连哦!