HtmlUnit Remote: Selenium 4 Grid でのリモート HtmlUnitDriver セッションの取得

この記事では、「HtmlUnit Remote」について説明します。これは、Selenium 4 Grid がこの「ヘッドレス」ブラウザのリモートインスタンスを管理できるようにする HtmlUnitDriver のラッパーです。

HTMLUNIT REMOTE

Maven Central

HtmlUnit Remote プロジェクトは、HtmlUnitDriver 用の W3C WebDriver プロトコル ラッパーを実装しており、これにより Selenium 4 Grid がこのヘッドレスブラウザのリモートセッションを提供できるようになります。

背景

ローカル構成とリモート構成間の動作の差異をなくすために、Selenium Foundation フレームワークは常に Grid インスタンスからブラウザセッションを取得し、既存の Grid を使用するように構成されていない場合は、独自のローカル Grid インスタンスを管理します。Selenium 3 GridHtmlUnitDriver セッションを提供するように構成でき、Node サーバー自体内の特殊なケース処理によってサポートされていました。この処理は、新しいアーキテクチャと大幅に拡張された機能で完全に再設計された Selenium 4 Grid には引き継がれませんでした。

Selenium 4 Grid での HtmlUnitDriver サポートの欠如により、Selenium Foundation プロジェクトのユニットテストを、この Java のみの管理されたアーティファクトの使用から、Chrome のような標準ブラウザの使用に再構成する必要がありました。これは、追加のリソースを必要とし、追加の障害リスクをもたらす外部依存関係です。

HtmlUnit Remote によって実装されたドライバサービスにより、Selenium 4 GridHtmlUnitDriver セッションを提供できるようになります。

プロジェクトの目的

HtmlUnit Remote を作成する当初の目的は、Selenium 3 および Selenium 4 でサポートされているブラウザのセットについて、Selenium Foundation での機能パリティを維持することでした。ユニットテストを従来のブラウザをターゲットにするように構成することもできましたが、関連するリスクを伴う追加の外部依存関係も回避したいと考えていました。

Selenium 4 GridHtmlUnitDriver セッションを提供できるようにするために必要な機能と機能性を調査し始めたところ、このプロジェクトが提供できる追加の利点、つまり包括的な標準化された構成可能性を認識しました。

HtmlUnitDriver の設定

すべてのリモートドライバは、標準の Selenium 機能である Capabilities オブジェクトを介して構成されます。HtmlUnit Remote プロジェクト以前は、HtmlUnit の多くのオプションは、Capabilities API を介してアクセスまたは変更できませんでした。これらはカスタム HtmlUnitDriver メソッドでのみ利用可能であり、非標準の Capabilities が Capabilities オブジェクトに追加された方法は、W3C 仕様に準拠していませんでした。

これは、HtmlUnit Remote プロジェクトの最初のフェーズが、包括的な W3C 準拠の構成オブジェクトである HtmlUnitDriverOptions クラスを実装することであったことを意味します。このクラスは AbstractDriverOptions を拡張し、garg:htmlunitOptions という名前の拡張機能の下にドライバ固有の Capabilities を追加します。このクラスのサポートにより、標準の Capabilities API を介してすべての HtmlUnitDriver オプションを完全に構成できるようになります。

この標準化された構成 API は HtmlUnitDriver に直接組み込まれ、すべてのドライバ設定を操作するためのコア実装を提供します。後方互換性を維持するために、既存のすべてのコンストラクタと構成メソッドは保持され、この新しいコア API を使用するように再実装されました。

W3C リモートプロトコルラッパー

完全な標準化された構成可能性が整ったので、次のステップは W3C WebDriver プロトコル を実装するサーバーを作成することでした。HtmlUnitDriverServer は、1つ以上の HtmlUnitDriver セッションの周りのリモートプロトコルラッパーとして機能し、次のタスクを実行します。

  • ドライバセッションの作成と管理
  • ドライバコマンドを指定されたドライバセッションにルーティング
  • ドライバメソッドの結果を HTTP レスポンスにパッケージ化

HtmlUnit Remote のパッケージング

リモート固有の機能で既存のドライバを肥大化させるのではなく、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 GridHtmlUnitDriver のリモートセッションを提供できるようにするために必要なすべての仕様とサービスプロバイダを提供します。このアーティファクトは、htmlunit-remotehtmlunit3-driverhtmlunit、およびそれらの固有の依存関係と組み合わせたものです。

実装の詳細

HtmlUnit Remote は、次の要素を提供します。

  • HtmlUnitDriverInfo - このクラスは、Selenium 4 GridHtmlUnitDriver が利用可能であることを通知し、新しいドライバインスタンスを作成する方法を提供します。
  • HtmlUnitSlotMatcher - このカスタムスロットマッチャーは DefaultSlotMatcher を拡張し、スロットステレオタイプと要求されたブラウザ Capabilities の両方がブラウザ名として htmlunit を指定した場合に一致を示します。
  • HtmlUnitDriverService - このクラスは、HtmlUnitDriver のインスタンスをホストするサーバーを管理します。
  • HtmlUnitDriverServer - これは、W3C WebDriver プロトコル を介したリモート操作を可能にする、HtmlUnitDriver インスタンスをホストするサーバークラスです。

動作中、HtmlUnitDriverService は、HtmlUnitDriver をサポートするように構成された Selenium 4 Grid ノードサーバーによってインスタンス化されます。作成されたドライバセッションごとに新しいプロセスを起動する他のドライバサービスとは異なり、HtmlUnitDriverService は、作成するすべてのドライバセッションをホストする単一のインプロセスサーバーを起動します。

これは、Scott Babcock によるゲストブログ投稿です