HtmlUnit Remote:在 Selenium 4 Grid 中取得遠端 HtmlUnitDriver 會話
分類
HTMLUNIT REMOTE
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 3 和 Selenium 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-remote 與 htmlunit3-driver、htmlunit 以及它們所有獨特的依賴項。
實作細節
HtmlUnit Remote 提供了以下元素
- HtmlUnitDriverInfo - 這個類別通知 Selenium 4 Grid HtmlUnitDriver 可用,並提供了一種創建新驅動程式實例的方法。
- HtmlUnitSlotMatcher - 這個自訂插槽匹配器擴展了 DefaultSlotMatcher,如果插槽原型和請求的瀏覽器 capabilities 都指定
htmlunit作為瀏覽器名稱,則表示匹配。 - HtmlUnitDriverService - 這個類別管理一個伺服器,該伺服器託管 HtmlUnitDriver 的實例。
- HtmlUnitDriverServer - 這是伺服器類別,用於託管 HtmlUnitDriver 實例,透過 W3C WebDriver 協定 實現遠端操作。
在運作中,HtmlUnitDriverService 由配置為支援 HtmlUnitDriver 的 Selenium 4 Grid 節點伺服器實例化。與其他驅動程式服務不同,後者為每個創建的驅動程式會話啟動一個新進程,HtmlUnitDriverService 啟動一個單一的進程內伺服器,用於託管它創建的所有驅動程式會話。
這是一篇由 Scott Babcock 撰寫的客座部落格文章




