Selenium Gridを始める

シンプルなSelenium Gridのインストラクション

クイックスタート

  1. 前提条件
  2. Gridを起動
    • java -jar selenium-server-<version>.jar standalone
  3. WebDriverテストをhttps://:4444に向けてください
  4. (オプション)ブラウザでhttps://:4444を開いて、実行中のテストと利用可能なケイパビリティを確認してください

*テストをhttps://:4444に向ける方法がわからない?RemoteWebDriver セクションを確認してください。

さまざまな構成オプションの詳細については、以下のセクションを参照してください。

Gridの役割

Gridは6つの異なるコンポーネントで構成されており、さまざまな方法でデプロイできます。

ニーズに応じて、それぞれを個別に(分散)、ハブとノードにグループ化するか、すべてを1台のマシン(スタンドアロン)で開始できます。

スタンドアロン

スタンドアロンは、すべてのGrid コンポーネントを1つにシームレスに結合します。スタンドアロンモードでGridを実行すると、単一のコマンドで、単一のプロセス内で完全に機能するGridが得られます。スタンドアロンは、単一のマシンでのみ実行できます。

スタンドアロンは、Selenium Gridを起動する最も簡単なモードでもあります。デフォルトでは、サーバーはhttps://:4444RemoteWebDriverリクエストをリッスンします。デフォルトでは、サーバーはシステムPATHから使用できるドライバを検出します。

java -jar selenium-server-<version>.jar standalone

スタンドアロンモードでGridが正常に起動したら、WebDriverテストをhttps://:4444に向けてください。

スタンドアロンの一般的なユースケースは次のとおりです

  • ローカルでRemoteWebDriverを使用してテストを開発またはデバッグする
  • コードをプッシュする前に、クイックテストスイートを実行する
  • CI/CDツール(GitHub Actions、Jenkinsなど)で簡単にGridをセットアップする

ハブとノード

ハブとノードは、最も使用されている役割です。なぜなら、次のことが可能になるからです

  • 単一のGridに異なるマシンを結合する
    • たとえば、オペレーティングシステムやブラウザのバージョンが異なるマシン
  • 異なる環境でWebDriverテストを実行するための単一のエントリポイントを持つ
  • Gridを分解せずに容量をスケールアップまたはスケールダウンする

ハブ

ハブは、次のコンポーネントで構成されています:ルーター、ディストリビューター、セッションマップ、新しいセッションキュー、およびイベントバス。

java -jar selenium-server-<version>.jar hub

デフォルトでは、サーバーはhttps://:4444RemoteWebDriverリクエストをリッスンします。

ノード

起動時に、ノードはシステムPATHから使用できるドライバを検出します。

以下のコマンドは、ノードハブが実行されているのと同じマシンで実行されていることを前提としています。

java -jar selenium-server-<version>.jar node
同じマシン上に複数のノード

ノード 1

java -jar selenium-server-<version>.jar node --port 5555

ノード 2

java -jar selenium-server-<version>.jar node --port 6666
異なるマシン上のノードとハブ

ハブノードは、HTTPおよびイベントバスイベントバスハブ内に存在します)を介して通信します。ノードは、登録プロセスを開始するためにイベントバスを介してハブにメッセージを送信します。ハブがメッセージを受信すると、HTTPを介してノードに接続し、その存在を確認します。

ノードハブに正常に登録するには、イベントバスポート(デフォルトでは4442および4443)をハブマシンで公開することが重要です。これはノードポートにも当てはまります。これにより、ハブノードの両方が通信できるようになります。

ハブがデフォルトポートを使用している場合、--hubフラグを使用してノードを登録できます

java -jar selenium-server-<version>.jar node --hub http://<hub-ip>:4444

ハブがデフォルトポートを使用していない場合、--publish-eventsおよび--subscribe-eventsフラグが必要です。

たとえば、ハブがポート88868887、および8888を使用している場合

java -jar selenium-server-<version>.jar hub --publish-events tcp://<hub-ip>:8886 --subscribe-events tcp://<hub-ip>:8887 --port 8888

ノードは、正常に登録するためにこれらのポートを使用する必要があります

java -jar selenium-server-<version>.jar node --publish-events tcp://<hub-ip>:8886 --subscribe-events tcp://<hub-ip>:8887

分散

分散Gridを使用する場合、各コンポーネントは個別に起動され、理想的には異なるマシンで起動されます。

  1. イベントバス:異なるGridコンポーネント間の内部通信を可能にします。

デフォルトポートは:44424443、および5557です。

java -jar selenium-server-<version>.jar event-bus --publish-events tcp://<event-bus-ip>:4442 --subscribe-events tcp://<event-bus-ip>:4443 --port 5557
  1. 新しいセッションキュー:ディストリビューターによってクエリされるキューに新しいセッションリクエストを追加します

デフォルトポートは5559です。

java -jar selenium-server-<version>.jar sessionqueue --port 5559
  1. セッションマップ:セッションIDをセッションが実行されているノードにマッピングします

デフォルトのセッションマップポートは5556です。セッションマップイベントバスと対話します。

java -jar selenium-server-<version>.jar sessions --publish-events tcp://<event-bus-ip>:4442 --subscribe-events tcp://<event-bus-ip>:4443 --port 5556
  1. ディストリビューター:新しいセッションリクエストのために新しいセッションキューをクエリし、ケイパビリティが一致する場合にノードに割り当てます。ノードは、ハブ/ノードGridでハブに登録する方法と同様に、ディストリビューターに登録します。

デフォルトのディストリビューターポートは5553です。ディストリビューターは、新しいセッションキューセッションマップイベントバス、およびノードと対話します。

java -jar selenium-server-<version>.jar distributor --publish-events tcp://<event-bus-ip>:4442 --subscribe-events tcp://<event-bus-ip>:4443 --sessions http://<sessions-ip>:5556 --sessionqueue http://<new-session-queue-ip>:5559 --port 5553 --bind-bus false
  1. ルーター:新しいセッションリクエストをキューにリダイレクトし、実行中のセッションリクエストをそのセッションを実行しているノードにリダイレクトします。

デフォルトのルーターポートは4444です。ルーターは、新しいセッションキューセッションマップ、およびディストリビューターと対話します。

java -jar selenium-server-<version>.jar router --sessions http://<sessions-ip>:5556 --distributor http://<distributor-ip>:5553 --sessionqueue http://<new-session-queue-ip>:5559 --port 4444
  1. ノード

デフォルトのノードポートは5555です。

java -jar selenium-server-<version>.jar node --publish-events tcp://<event-bus-ip>:4442 --subscribe-events tcp://<event-bus-ip>:4443

テストのメタデータ

メタデータをテストに追加し、GraphQLを介して消費するか、Selenium Grid UIを通じてその一部(se:nameなど)を視覚化します。

メタデータは、ケイパビリティにse:をプレフィックスとして追加することで追加できます。Javaでの簡単な例を次に示します。

ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setCapability("browserVersion", "100");
chromeOptions.setCapability("platformName", "Windows");
// Showing a test name instead of the session id in the Grid UI
chromeOptions.setCapability("se:name", "My simple test"); 
// Other type of metadata can be seen in the Grid UI by clicking on the 
// session info or via GraphQL
chromeOptions.setCapability("se:sampleMetadata", "Sample metadata value"); 
WebDriver driver = new RemoteWebDriver(new URL("http://gridUrl:4444"), chromeOptions);
driver.get("http://www.google.com");
driver.quit();

Selenium Gridのクエリ

Gridを起動した後、主にGrid UIまたはAPI呼び出しを介してステータスをクエリする2つの方法があります。

Grid UIには、お好みのブラウザを開いてhttps://:4444にアクセスすることでアクセスできます。

API呼び出しは、https://:4444/statusエンドポイントを介して、またはGraphQLを使用して行うことができます

簡単にするために、このページに示されているすべてのコマンド例は、コンポーネントがローカルで実行されていることを前提としています。より詳細な例と使用法は、コンポーネントの構成セクションにあります。

Java 11 HTTPクライアントの使用

Selenium v4.5

デフォルトでは、GridはAsyncHttpClientを使用します。AsyncHttpClientは、Nettyの上に構築されたオープンソースライブラリです。HTTPリクエストとレスポンスの非同期実行を可能にします。さらに、WebSocketサポートも提供します。したがって、適切です。

ただし、AsyncHttpClientは2021年6月以降、積極的にメンテナンスされていません。これは、Java 11以降が組み込みのHTTPおよびWebSocketクライアントを提供しているという事実と一致します。現在、Seleniumはサポートされている最小バージョンをJava 11にアップグレードする計画があります。ただし、かなりの労力が必要です。ユーザーエクスペリエンスを損なわないようにするために、メジャーリリースとそれに伴う発表に合わせて調整することが重要です。

Java 11クライアントを使用するには、selenium-http-jdk-client jarファイルをダウンロードし、--extフラグを使用してGrid jarのクラスパスで使用できるようにする必要があります。

jarファイルは、repo1.maven.orgから直接ダウンロードし、次の方法でGridを起動できます

java -Dwebdriver.http.factory=jdk-http-client -jar selenium-server-<version>.jar --ext selenium-http-jdk-client-<version>.jar standalone

selenium-http-jdk-client jarファイルをダウンロードする代わりに、Coursierを使用することもできます。

java -Dwebdriver.http.factory=jdk-http-client -jar selenium-server-<version>.jar --ext $(coursier fetch -p org.seleniumhq.selenium:selenium-http-jdk-client:<version>) standalone

ハブ/ノードモードまたは分散モードを使用している場合は、-Dwebdriver.http.factory=jdk-http-clientフラグと--extフラグをコンポーネントごとに設定する必要があります。

Gridのサイズ

Gridの役割の選択は、サポートする必要のあるオペレーティングシステムとブラウザ、実行する必要のある並列セッションの数、利用可能なマシンの数、およびそれらのマシンの能力(CPU、RAM)によって異なります。

同時セッションの作成は、ディストリビューターが利用できるプロセッサに依存します。たとえば、マシンに4つのCPUがある場合、ディストリビューターは最大4つのセッションを同時に作成できます。

デフォルトでは、ノードがサポートする同時セッションの最大数は、利用可能なCPUの数によって制限されます。たとえば、ノードマシンに8つのCPUがある場合、最大8つの同時ブラウザセッションを実行できます(Safariは常に1つです)。さらに、各ブラウザセッションは約1GBのRAMを使用することが予想されます。

一般に、ノードはできるだけ小さくすることをお勧めします。32個の同時ブラウザセッションを実行するために32個のCPUと32GBのRAMを備えたマシンを用意する代わりに、プロセスをより適切に分離するために32個の小さなノードを用意することをお勧めします。これにより、ノードが失敗した場合でも、隔離された方法で失敗します。Dockerはこのアプローチを実現するための優れたツールです。

デフォルト値(ブラウザあたり1CPU/1GB RAM)は推奨値であり、コンテキストに適用されない可能性があることに注意してください。それらを参照として使用することをお勧めしますが、パフォーマンスを継続的に測定することで、環境に最適な値を決定するのに役立ちます。

Gridのサイズは、サポートされている同時セッションの数とノードの数に関連しており、「万能のサイズ」はありません。以下に言及されているサイズは、環境によって異なる可能性のある概算です。たとえば、ハブに十分なリソースがある場合、120個のノードを持つハブ/ノードはうまく機能する可能性があります。以下の値は固定ではなく、フィードバックを歓迎します!

スタンドアロンまたは5つ以下のノードを持つハブ/ノード

6〜60個のノード間のハブ/ノード

60〜100個のノード間のハブ/ノード。100個を超えるノードを持つ分散

警告

Selenium Gridは、適切なファイアウォール許可を使用して外部アクセスから保護する必要があります。

Gridを保護しないと、次のいずれかまたは複数が発生する可能性があります

  • Gridインフラストラクチャへのオープンアクセスを提供します
  • サードパーティが内部Webアプリケーションとファイルにアクセスできるようにします
  • サードパーティがカスタムバイナリを実行できるようにします

パブリックに公開されたGridがどのように悪用される可能性があるかについての概要については、Detectifyのこのブログ投稿を参照してください:グリッドを公開したままにしないでください

参考文献

  • コンポーネント:Gridの内部コンポーネントが互いにどのように関連しているかを学びます。
  • 構成:Gridのセットアップをカスタマイズします。
  • アーキテクチャ:Gridの重要な概念を理解します。
  • 高度な機能:Gridの機能を介してより多くの可能性を探ります。