Selenium 等待

2025年3月17日 | 阅读 10 分钟

在编写你的第一个 Selenium 程序时,你可能已经遇到过等待命令。在本文中,你将学习 Selenium 等待到底是什么。你将涵盖各种类型和其他必要的因素,以便开始使用 Selenium 等待。

什么是 Selenium 等待?

Selenium 中的等待是执行测试用例的重要代码片段之一。它在某些称为脚本的命令上运行,这些脚本使页面加载。 Selenium 等待使页面不那么活跃可靠。它提供了各种类型的等待选项,在有利条件下足够且合适。这确保了你在使用它执行自动化测试时不会搞砸并最终导致脚本失败。

详细地说,Selenium 等待帮助用户在跨不同网页进行页面重定向时排除各种问题。这是通过刷新整个网页并使用新元素重新加载它来实现的。有时,也会调用来自 Ajax 的调用。因此,在重新加载页面和反映刷新后网页上存在的元素时,可能会存在一些时间滞后。

理解 Selenium 等待的另一个例子是使用 navigate() 命令来回导航网页。此 navigate() 方法来自 WebDriver,其主要任务是模拟和体现实时场景,例如关于浏览历史记录的网页之间的导航。

为什么需要在 Selenium 中使用等待?

如今,大多数现代应用程序的前端都基于 AjaxJavaScript 构建,随后是 Angular、React 或任何其他流行的框架,这需要一些时间才能在网页上加载元素。因此,在这种情况下,当您尝试定位脚本中存在的但尚未加载到网页上的元素时,Selenium 会抛出 'ElementNotVisibleException' 消息。

为了澄清,您可以查看下面的代码片段,其中执行了使用 Selenium 的自动化测试。

给定的代码将帮助你展示与使用 Selenium 执行自动化测试时遇到的相同问题。使用了 easemytrip.com 的示例,其中发布用户选择“从”和“到”目的地以及旅程日期。 Web 应用程序需要一定的时间才能加载所需的航班详细信息。在这种情况下,如果不应用等待,用户倾向于从列表中预订第一班航班。由于页面尚未加载,因此脚本未能找到“立即预订”按钮。这导致抛出一个 'NoSuchElementException'。如下所示

上面的代码片段描述了使用 Selenium 执行自动化测试时遇到的相同问题。在此代码片段中,你可以看到一个 "easemytrip.com" 的示例,用户将在其中选择 'From''To' 目的地,并选择旅程日期。Web 应用程序需要一定的加载时间才能根据用户提供的选定输入字段加载可用的航班。在这种情况下,用户可能只会从列表中选择并预订第一班航班。由于页面仍在加载,脚本未能找到“立即预订”按钮。这直接抛出一个 'NoSuchElementExpection' 返回状态,输出如下所示。

Selenium Waits

Selenium 中等待的类型

Selenium Waits

隐式等待

隐式等待的主要功能是告诉 Web 驱动程序在抛出 "No Such Element Exception" 之前等待一段时间。其默认设置归零。一旦设置了时间,驱动程序将自动等待您定义的时间量,然后才会抛出上面给出的异常。

语法

为了了解隐式等待如何工作,让我们考虑一个例子。

在上面给出的代码片段中,隐式等待仅定义为 20 秒,这意味着输出将在特定元素的最长等待时间 20 秒内加载或到达。

注意:隐式等待是全局应用的。它可用于驱动程序实例。这也意味着如果驱动程序在此期间与一千个元素进行交互,则隐式等待仅适用于这 1000 个元素。它无法超越该范围。

显式等待

显式等待也称为动态等待,因为它具有高度特定的条件。它通过 WebDriverWait 类实现。要了解为什么需要在 Selenium 中使用显式等待,您必须了解程序中等待语句的基本知识。简而言之,您必须了解一些条件。创建这些条件是为了让你了解显式等待以及它们为何重要。

条件 1

假设你有一个网页,其中包含一个登录表单,该表单接受输入并加载主页或主页面内容。由于时间限制和网络频率,此页面是动态的,有时需要 10 秒或 15 秒才能完全加载。显式等待在这种情况下派上用场,并允许您等待直到页面未显示为止。

条件 2

假设你正在开发一个以旅行为主题的应用程序,用户填写 Web 表单并使用提交按钮提交。现在,你可能需要等到特定数据未显示为止。在这种情况下,显式等待通过等待特定时间段内尚未显示的一组元素来提供帮助。

语法

上面的语法证明了 WebDriver Wait 的对象,并传递给驱动程序的首选项,超时作为参数。要更广泛地理解这一点,请考虑下面的示例应用程序。

在上面给出的示例片段中,你可以看到使用定位器创建了 Facebook 注册凭据。此外,还创建了一个通用实用程序函数,使所有元素都可用于显式等待。此外,还为特定的文本字段定义了 sendKeys() 方法,该方法将在内部提供显式等待。在 sendKeys() 方法中,存在一些元素的预期条件。这意味着要求驱动程序等待 20 秒,直到该元素的预期条件可见。此外,应用 sendKeys() 方法的主要目的是获取名字和姓氏,并将其传递给驱动程序。名字和姓氏的超时时间定义为 10 秒。

执行上述程序时,Chrome 驱动程序将启动 Chrome,并导航到 facebook.com 以获取提到的值。虽然不是强制性的,但显式设置为特定值设置超时,因为它是可更改的。在此处添加的另一个优点是,一旦你为 10 秒定义了超时,它将适用于网页上存在的所有元素,然后无法修改。相同的概念适用于上述程序中定义的 onClick() 方法,但此方法仅限于链接。这是执行、理解和执行显式等待的最佳方式。

注意:动态权重被认为是动态的,因为如果您采用隐式、显式或 Fluent 等待,并将超时方法定义为 20 秒,并且如果元素仅需要 5 秒,则不会考虑剩余的 15 秒。它不会等待整整 20 秒。

隐式和显式之间的区别

  1. 隐式等待适用于脚本中的所有元素,而显式等待仅适用于用户要定义的那些值。
  2. 隐式等待需要在定位的元素上指定“ExpectedConditions”,而显式等待不需要用此条件指定。
  3. 隐式等待需要以元素可见性、可单击元素以及要选择的元素等方法来指定时间框架。相反,显式等待是动态的,不需要这样的规范。

Fluent 等待

Fluent 等待与显式等待非常相似。在管理和功能方面是相似的。在 Fluent 等待中,只有在不清楚单击或可见需要多长时间时,才能执行元素的等待操作。 Fluent 提供的几个不同因素如下

池化频率

显式情况下的池化频率为 500 毫秒。但是,使用 Fluent 等待,可以将此池化频率更改为任何基于您需要的值。这通常意味着告诉脚本每隔“x”秒监视该元素。

忽略异常

在池化时,如果找不到元素,你可以忽略一些期望,例如“NoSuchElement”。除了这个因素之外,与显式和隐式等待类似,你还可以定义元素可操作或可见的时间量。

语法

虽然语法看起来很复杂,但是当你开始使用它时它会派上用场。这就是为什么可能所有软件测试人员都喜欢使用显式和隐式等待的原因,因为语法简单。 Fluent 等待看起来很复杂,因为它没有提供需要应用于元素的预定义条件。相反,Fluent 等待在其 apply 方法中定义其条件。

在上面的代码片段中,你可以观察到 fluent 等待已设置为 30 秒的超时时间,并且频率保持在 5 秒,“NoSuchElementException”。在另一个实例中,创建了一个新函数来标识前一页上的 Web 元素。如果发现该元素在同一时间范围内,则可以执行所有操作。如果由于某种原因出现任何错误,该函数将返回“ElementNotVisibleException”。

Selenium 等待的云应用

大多数测试人员更喜欢使用旨在适应 Selenium 的一些基于云的服务提供商来执行他们正在从事的项目的自动化测试。 LamdbaTest 就是这样一种流行的基于云的测试方法。 LambdaTest 是一种功能强大的跨平台浏览器测试工具。

假设你正在运行基于云的 Selenium Grid(如 LambdaTest),这就是 Selenium 复杂测试套件出现快速超时问题的地方。你还可以选择将 WebDriver 暂停 90 秒的便利,这也可以选择作为默认时间限制,从而避免超时错误,因为自动化脚本会成功运行。

结论

Selenium 等待帮助用户设计具有可靠性和更少依赖项的脚本。你可以选择继续使用哪个等待,方法是确保业务部门实现结果以及使用 Selenium 进行自动化测试背后的目的。另一个需要注意的重要方面是确保你不会不必要地将 Selenium 等待保留在你的应用程序中。最初,Selenium 的早期版本中存在线程选项,现在已替换为等待。 Selenium 等待提供动态测试方法和使用 JUnit 或其他测试机制等平台进行测试的最佳环境。在本文中,你了解了隐式、显式和 Fluent 等待等以前的等待之间的区别。你还通过示例代码片段了解了 Selenium 等待的各个方面如何紧密地集成在一起。


下一主题#