如何使用Selenium测试使用AJAX技术的Web应用程序(三)

页面上的更改

以下是我们如何实现等待:基于WebDriverWait和FluentWait的示例,Selenium 中的Thread.sleep()、WebDriver 隐式等待、显式等待。下面我们将分别研究这些方法中的每一种。

实现等待的另一种方法是使用第三方库,这些库允许您控制重复的策略并捕获异常。˚F或例如,故障安全. 我们不会详细介绍这种方法,而是将自己限制在 Java 和 Selenium WebDriver 提供的选项上。

为什么使用 Thread.sleep() 方法?

原始的等待方式是使用Thread.sleep()方法停止当前执行的线程。

AJAX 技术

此处测试脚本暂停10秒,然后尝试找到所需的项目。暂停会大大增加脚本执行时间,因为无论元素出现多快,它的搜索都会持续一段固定的时间。实际上,我们认为这种很少使用的方法是一种反模式。

我们创造了一个长时间的停顿,对当时正在发生的(或者更确切地说没有发生的)问题没有影响。它不能以任何方式加速或配置此过程。

其他方法也暂停脚本执行,但不是一次大的暂停,而是以特定的时间间隔进行小暂停。在暂停之间,您可以检查页面的状态并决定下一步要做什么。因此,减少了总等待时间,从而减少了测试通过所需的时间。

隐式等待

Selenium允许您指定驱动程序搜索项目的隐式等待时间:

AJAX 技术

对于对findElement方法的每个单独调用,隐式等待不需要任何操作。当您为驱动程序设置ImplicityWait值时,它对所有未来请求都有效。默认情况下,它等于零。

要搜索单个元素,驱动程序会轮询页面,直到找到该元素或指定的等待间隔结束。并且只有在此之后,如果未找到该元素,才会触发NoSuchElementException。如果该元素出现,脚本会立即进行下一步。因此,样品测试可能需要少于 10 秒,但不会超过 10 秒。搜索多个元素时,脚本将在第一个元素出现时继续执行。使用隐式等待的优点是代码简洁。我们将只设置一次驱动程序并忘记它。

隐式等待的缺点

但是,Selenium的隐式等待机制有两个明显的缺点:

首先,这种机制不够灵活,它只允许你检查一个条件:元素是否出现在页面上。爬行过程本身没有以任何方式配置。

其次,它是在 Selenium 的远程部分(控制浏览器的远程部分)上实现的,它的行为没有记录并且可能很模糊。

因此,不能同时使用隐式和显式等待,在这种情况下,等待时间可能变得不确定,并且可能会出现特定的错误。大型复杂页面也可能存在性能问题。因此,根据 Selenium 官方文档:

“明智地使用增加隐式等待超时的能力,因为它会对测试运行时间产生不利影响,尤其是在与 XPath 等较慢的定位策略一起使用时。”

流利等待

另一种选择是使用实现Wait接口的类。这些等待被称为显式等待,因为它们是在每次发出请求时指定的。他们可能需要多次尝试。该FluentWait类允许您配置不仅是搜索时间,而且还企图和一组被忽略的异常类型之间停顿的数量。Wait接口中描述的until方法将isTrue函数作为参数。该函数循环重复。如果isTrue返回false、null或抛出异常作为响应,则尝试失败。

在其他情况下,尝试成功。如果尝试成功,它将结果对象返回给主脚本,脚本继续运行。

在这个例子中,搜索每半秒重复一次。

如果找到该元素,脚本将立即继续,测试将成功完成。

如果搜索时抛出NoSuchElementException类型的异常,则尝试将继续。

如果尝试抛出不同类型的异常,脚本将以该异常结束。

如果元素未在 10 秒内出现,则脚本将以TimeoutException类型的异常结束。

网络驱动程序等待

该WebDriverWait类是继承类FluentWait,使得它更加具体,以便能够与工作的webdriver。这两个类有以下区别:
默认情况下,WebDriverWait 会忽略NotFoundException类型(及其继承者)的异常。也就是说,您不需要每次都为NoSuchElementException配置“忽略” 。

TimeoutException包含有关 WebDriver 设置的更多信息,包括RemoteWebDriver 的设置。
有一些构造函数允许您在一行中设置多个参数。因此,执行相同操作的脚本变得更短:

预期条件

有一组功能通常需要显式等待。它们聚集在 ExpectedConditions 类中。

例如:

PresenceOfElementLocated (final By locator) - 元素在页面上

visibilityOfElementLocated (final By locator) - 这个元素是可见的

elementToBeClickable (final By locator) - 你可以点击这个元素

textToBe (final By locator, final String value) - 元素的值 `text` 等于 value

使用示例:

这里不是函数驱动程序 -> driver.findElement()使用函数PresenceOfElementLocated (),它执行相同的操作。或者我们可以等待正确的文本:

这些条件的操作原理与函数isTrue的操作原理相同,如果满足条件,例如元素在页面上并且包含某个文本,则该元素与函数 'until' 一起返回到主脚本和脚本继续。

普遍性

您可以配置显式等待一次并使用相同的设置执行所有操作,例如:

此方法允许您创建多个配置并将它们用于不同的情况。例如,增加某些操作的超时时间:

然后您可以使用wait.until()进行常规操作,以及那些预计需要很长时间的操作放大Wait.until ()。

第三方库

可以使用第三方库创建自己的显式等待版本,实现接口 Wait。例如,Failsafe 库提供了对重复策略的灵活调整,包括对异常和条件的调整以暂停和继续重复循环。

此示例说明如何使用类似于 Selenium WebDriverWait的功能实现显式等待。当我们使用这样的等待时,请求将通过一秒的暂停重复 10 次。增强NotFoundException的异常将被忽略。当函数isTrue返回一个非零非假值时,则该值将返回给主脚本,脚本将继续运行。同样,这里可以使用ExpectedConditions的功能,无需任何更改。

Failsafe 是一个具有开源代码和零依赖关系的轻量级库。

由于它也是显式等待,在测试代码一侧实现,因此不要与隐式等待一起使用。

恢复

AJAX 技术允许您向服务器发出请求并更改页面内容而无需重新加载。如果我们正在测试使用 AJAX 技术的 Web GUI,我们必须考虑页面的异步行为。使用Thread.sleep()可以大大增加测试时间。浏览器的 WebDriver 端的隐式等待工作。它们允许您指定一个超时期限来搜索项目。它们适合简单的页面。几乎不需要额外的代码。Selenium 显式等待在测试代码一侧工作并与编程语言相关联。在 Java 中,它们被实现为WebDriverWait和FluentWait类。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值