Selenium 4 的新技巧

今天,我们将介绍 Selenium 4 提供的一些新技巧和功能。

在他的系列文章的第三篇中,Simon Stewart 继续讨论 Selenium 4 中的新功能,并回顾了新版本中的一些技巧。

在我之前的文章中,我们讨论了如何为 Selenium 做贡献,以及为什么我们将版本号升级到 4。前言就到这里!今天,我们将介绍 Selenium 4 提供的一些新技巧和功能。

查找元素和相对定位器

你知道,在页面上查找元素可能真的很难。我看到很多人使用非常复杂的 XPATH 表达式,并试图找出复杂的 CSS 选择器等等。SeleniumConf 上有关于这个主题的完整演讲。肯定有更好的方法来做这件事,不是吗?

想想我们如何描述元素在页面上的位置。想想你会如何通过电话描述。你永远不会谈论原始 DOM,“啊,找到 ‘id’ 为 ‘foo’ 的 SPAN 内部嵌套的第五个 DIV 元素”。你永远不会那样说!相反,当谈论页面上事物的位置时,你会说,“找到那个图片上面的东西,以及那个链接右边的东西”。

很久以前,一个名为 Sahi 的项目开始像这样定位元素。Sahi 有关系 API,这是一种查找元素的可爱方式,它非常流畅和易于使用。多年前,当我开始开发 WebDriver 时,我与 Narayan(Sahi 的创建者)交谈,我向他承诺,我将推迟实现 Sahi 的这个旗舰功能。它很可爱,但也是 Sahi 理所应当感到自豪的东西。然而,现在还有其他工具,例如 Tyco,正在实现这种风格的 API,所以现在似乎是在 Selenium 中做同样的事情的时候了。在 Selenium 4 中,我们称它们为“相对定位器”。你有时可能会看到我们将它们称为“友好定位器”,因为最初的实现是这样称呼它们的,但“相对”更好地描述了它们的工作方式。我们有一些:near(附近),above(上方),below(下方),left of(左侧),right of(右侧)。它们允许你用人类语言谈论元素在页面上的位置。

展望未来,我们还计划使用户能够添加新的定位器类型,不仅在客户端,而且在 Selenium Server 上。例如,尽管 JS UI 框架来来去去(还有人记得使用 jquery 吗?),能够为人们喜欢的当前工具(例如 React)添加自定义定位器会很不错。

验证 Web 网站

自从我们开始这个项目以来,人们一直在要求的一个功能是能够验证网站的身份。以前,你可以通过正确地构建浏览器访问的 URL 来做到这一点,但这会将凭据泄露给任何中间人,并将它们留在服务器日志中,因此浏览器已慢慢删除了此功能。这很不幸,因为我们知道人们经常需要在测试中执行此操作。在 Selenium 4 中,我们现在提供了一种机制来注册可用于验证这些站点的用户名和密码。

拦截网络流量

Selenium 测试的常见抱怨是它们速度慢且不稳定。虽然与浏览器的绑定非常出色,并且完全由 W3C WebDriver 规范描述,但确实,任何端到端测试都可能比简单的单元测试更容易出现不稳定性——只是有更多的移动部件,以及更多出错的可能性。

解决此问题的一种方法是存根应用程序的后端,在测试中拦截网络流量并返回预先准备好的响应。诸如 mountebank 之类的工具使 API 测试变得容易。如果有一个类似的 Selenium 工具,那不是很好吗?

使用 Selenium 4,我们现在提供了一种使用 NetworkInterceptor(嗯,这就是我们在 Java 绑定中称呼它的名称)来执行此操作的机制。将你的 WebDriver 实例传递给它,它会在浏览器即将发出 HTTP 请求时被调用,允许你返回几乎任何你想要的东西。

Chrome 调试协议

正如我之前提到的,Selenium 4 的优点之一是我们致力于确保一个稳定且面向用户的现代化 API。这意味着什么?首先,我们需要承认,经过很长一段时间,浏览器自动化领域现在又出现了竞争。特别是以 Puppeteer 和 Cypress 的形式,退一步来说,它们提供了什么?它们建立在 Chrome DevTools 协议 (CDP)> 之上,该协议是为了在基于 Chromium 的浏览器中启用调试器而开发的。

由于它的设计目的,它是一个非常冗余的协议,而不是一个允许你深入了解浏览器的面向用户的 API。更糟糕的是,在测试和浏览器之间引入网络跃点,这种冗余会导致随着网络延迟的增加测试速度变慢。这就是为什么像 Puppeteer 这样的工具希望你在本地机器上运行。这对单个测试的速度来说很好,但使得并行化变得更加困难,因为你不能轻易使用 Sauce Labs 等服务。

更复杂的是,因为 CDP 被设计为调试协议,它可能会在版本之间毫无预警地发生变化。这就是为什么 Puppeteer 和 Cypress 与特定版本的浏览器绑定,这会给作为测试编写者的你带来一个难题:如何在多个浏览器版本上进行测试?更新测试 API 以获得不同的浏览器可能会导致你不再进行有效的 API 调用。不这样做会将你绑定到一个可能过时的浏览器版本。

尽管如此,使用 CDP 开辟了许多可能性,这就是为什么我们在 Selenium 4 中添加了对它的支持。事实上,我们的一些新功能是建立在其之上的(尽管我们隐藏了细节!)

但我们也做得比仅仅添加基本支持更进一步。Selenium 4 可以同时支持多个版本的 CDP,这意味着你可以在无需重写测试的情况下,使用当前和测试版的基于 Chromium 的浏览器进行测试。我们通过提供一个“理想化的 CDP”来实现这一点,该 CDP 是稳定的,并涵盖了我们认为测试需要的功能。如果这种理想化的世界观对你来说不够,我们也会暴露原始的 CDP API,让你能够灵活地选择最适合你测试的内容。

我们将此经验反馈到新的 W3C WebDriver Bidi 规范中,这有助于使其更适合测试人员。

我将在此文章中省略与 Selenium 4 中另一个重要技巧——新的 Selenium Grid 相关的所有细节,我将在下一篇文章中介绍。敬请期待!

这最初发布于 https://saucelabs.com/blog/new-tricks-in-selenium-4

最后修改于 2021 年 8 月 7 日:重命名目录 (e9895f27c26)