HtmlUnit Remote:在 Selenium 4 Grid 中取得遠端 HtmlUnitDriver 會話

這篇文章描述了 ‘HtmlUnit Remote’,一個 HtmlUnitDriver 的封裝器,使 Selenium 4 Grid 能夠管理這個「無頭」瀏覽器的遠端實例。

HTMLUNIT REMOTE

Maven Central

HtmlUnit Remote 專案實作了一個 W3C WebDriver 協定 封裝器,用於 HtmlUnitDriver,這使得 Selenium 4 Grid 能夠提供這個無頭瀏覽器的遠端會話。

背景

為了消除本地和遠端配置之間的行為差異,Selenium Foundation 框架始終從 Grid 實例獲取瀏覽器會話,在未配置為使用現有 Grid 時,管理其自己的本地 Grid 實例。Selenium 3 Grid 可以配置為提供 HtmlUnitDriver 會話,這由 Node 伺服器本身的特殊情況處理支援。這種處理方式並未延續到 Selenium 4 Grid 中,後者經過完全重新設計,採用了新的架構和大幅擴展的功能。

Selenium 4 Grid 中缺乏 HtmlUnitDriver 支援,導致需要重新配置 Selenium Foundation 專案單元測試,從使用這個僅限 Java 管理的工件,轉為使用 Chrome 等標準瀏覽器,這是一個外部依賴項,需要額外的資源並帶來額外的失敗風險。

HtmlUnit Remote 實作的驅動程式服務,使 Selenium 4 Grid 能夠提供 HtmlUnitDriver 會話。

專案理由

我創建 HtmlUnit Remote 的最初目標,是為了在 Selenium Foundation 中保留與 Selenium 3Selenium 4 支援的瀏覽器組合的功能對等性。儘管我可以將單元測試配置為以傳統瀏覽器為目標,但我也希望避免額外的外部依賴項及其相關風險。

一旦我開始研究我需要的功能和特性,以使 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,它指定了驅動程式的基本特性,並提供了一個使用指定的 capabilities 創建驅動程式會話的方法。這個類別實作了標準的 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,如果插槽原型和請求的瀏覽器 capabilities 都指定 htmlunit 作為瀏覽器名稱,則表示匹配。
  • HtmlUnitDriverService - 這個類別管理一個伺服器,該伺服器託管 HtmlUnitDriver 的實例。
  • HtmlUnitDriverServer - 這是伺服器類別,用於託管 HtmlUnitDriver 實例,透過 W3C WebDriver 協定 實現遠端操作。

在運作中,HtmlUnitDriverService 由配置為支援 HtmlUnitDriverSelenium 4 Grid 節點伺服器實例化。與其他驅動程式服務不同,後者為每個創建的驅動程式會話啟動一個新進程,HtmlUnitDriverService 啟動一個單一的進程內伺服器,用於託管它創建的所有驅動程式會話。

這是一篇由 Scott Babcock 撰寫的客座部落格文章

上次修改時間:2024 年 8 月 22 日:Adding image to HTML Unit Remote post (9d1f0ed59d7)