HtmlUnit 远程:在 Selenium 4 Grid 中获取远程 HtmlUnitDriver 会话

这篇文章介绍了“HtmlUnit Remote”,它是 HtmlUnitDriver 的一个封装器,使 Selenium 4 Grid 能够管理此“无头”浏览器的远程实例。

HTMLUNIT 远程

Maven Central

HtmlUnit Remote 项目为 HtmlUnitDriver 实现了一个 W3C WebDriver 协议封装器,它使 Selenium 4 Grid 能够提供此无头浏览器的远程会话。

背景

为了消除本地和远程配置之间的行为差异,Selenium Foundation 框架始终从 Grid 实例获取浏览器会话,在未配置为使用现有网格时管理其自身的本地网格实例。 Selenium 3 Grid 可以配置为提供 HtmlUnitDriver 会话,这通过 Node 服务器本身的特殊情况处理提供支持。此处理未被移植到 Selenium 4 Grid 中,后者已使用新的架构和大大扩展的功能进行了完全重新设计。

Selenium 4 Grid 中缺少 HtmlUnitDriver 支持,这使得 Selenium Foundation 项目单元测试必须从使用这种仅限 Java 管理的工件重新配置为使用像 Chrome 这样的标准浏览器,而 Chrome 是一种外部依赖项,需要额外的资源并带来额外的失败风险。

HtmlUnit Remote 实现的驱动程序服务使 Selenium 4 Grid 能够提供 HtmlUnitDriver 会话。

项目原理

我创建 HtmlUnit Remote 的最初目标是为 Selenium 3Selenium 4 支持的浏览器集在 Selenium Foundation 中保持功能对等。虽然我可以配置我的单元测试以针对传统浏览器,但我还想避免额外的外部依赖项以及相关的风险。

一旦我开始研究我需要的功能和特性来使 Selenium 4 Grid 能够提供 HtmlUnitDriver 会话,我认识到该项目可以提供额外的优势 - 全面的标准化可配置性。

HtmlUnitDriver 配置

所有远程驱动程序都通过标准的 Selenium 功能进行配置 - Capabilities 对象。在 HtmlUnit Remote 项目之前,许多 HtmlUnit 的选项无法通过 Capabilities API 访问或修改。这些只能通过自定义的 HtmlUnitDriver 方法获得,并且添加到 Capabilities 对象中的非标准功能的方式不符合 W3C 规范。

这意味着 HtmlUnit Remote 项目的初始阶段是实现一个全面的符合 W3C 的配置对象 - HtmlUnitDriverOptions 类。此类扩展了 AbstractDriverOptions,在名为 garg:htmlunitOptions 的扩展下添加特定于驱动程序的功能。对此类的支持通过标准的 Capabilities API 提供所有 HtmlUnitDriver 选项的完全可配置性。

此标准化配置 API 已直接集成到 HtmlUnitDriver 中,为操作每个驱动程序设置提供了核心实现。为了保持向后兼容性,所有现有的构造函数和配置方法都已保留,并已重新实现以使用此新的核心 API。

W3C 远程协议封装器

在全面标准化可配置性到位后,下一步是创建一个实现 W3C WebDriver 协议的服务器。 HtmlUnitDriverServer 充当一个或多个 HtmlUnitDriver 会话的远程协议封装器,执行以下任务

  • 创建和管理驱动程序会话
  • 将驱动程序命令路由到指定的驱动程序会话
  • 将驱动程序方法结果打包到 HTTP 响应中

HtmlUnit 远程打包

为了避免在现有驱动程序中加入远程专用功能,HtmlUnitDriverServer 和相关设施被打包在配套的 htmlunit-remote 工件中。除了服务器之外,此工件还定义了驱动程序信息提供程序 (HtmlUnitDriverInfo)、驱动程序服务 (HtmlUnitDriverService) 和自定义槽匹配器 (HtmlUnitSlotMatcher)。

连接到 Grid

接下来是 HtmlUnitDriverInfo,它指定了驱动程序的基本特性,并提供了一个使用指定功能创建驱动程序会话的方法。这个类实现了标准的 WebDriverInfo 接口。

通过此信息提供程序发布的 HtmlUnitDriver 的可用性,可以配置 Selenium 4 Grid 节点来提供驱动程序会话。

htmlunit.toml
[node]
detect-drivers = false
[[node.driver-configuration]]
display-name = "HtmlUnit"
stereotype = "{\"browserName\": \"htmlunit\"}"

[distributor]
slot-matcher = "org.openqa.selenium.htmlunit.remote.HtmlUnitSlotMatcher"

selenium-server JAR 不包含 HtmlUnitDriver 工件;这些需要通过 --ext 选项指定为 grid 类路径的扩展。

java -jar selenium-server-<version>.jar --ext htmlunit-remote-<version>-grid-extension.jar standalone --config htmlunit.toml

grid-extension 工件提供了启用 Selenium 4 Grid 来提供 HtmlUnitDriver 远程会话所需的所有规范和服务提供程序。此工件将 htmlunit-remotehtmlunit3-driverhtmlunit 及其所有唯一的依赖项相结合。

实现细节

HtmlUnit Remote 提供以下元素

  • HtmlUnitDriverInfo - 此类通知 Selenium 4 Grid HtmlUnitDriver 可用,并提供创建新驱动程序实例的方法。
  • HtmlUnitSlotMatcher - 此自定义槽匹配器扩展了 DefaultSlotMatcher,如果槽刻板印象和请求的浏览器功能都将 htmlunit 指定为浏览器名称,则表示匹配。
  • HtmlUnitDriverService - 此类管理一个托管 HtmlUnitDriver 实例的服务器。
  • HtmlUnitDriverServer - 这是托管 HtmlUnitDriver 实例的服务器类,通过 W3C WebDriver 协议 实现远程操作。

在运行中,HtmlUnitDriverService 由配置为支持 HtmlUnitDriverSelenium 4 Grid 节点服务器实例化。与其他为每个创建的驱动程序会话启动新进程的驱动程序服务不同,HtmlUnitDriverService 启动一个单一的进程内服务器,该服务器托管其创建的所有驱动程序会话。

这是一篇由 Scott Babcock 撰写的客座博客文章

上次修改时间:2024 年 8 月 22 日:向 HTML Unit Remote 帖子添加图像 (9d1f0ed59d7)