Selenium Gridを始める
クイックスタート
- 前提条件
- Java 11以上がインストール済み
- ブラウザがインストール済み
- ブラウザドライバ
- Selenium Manager は、
--selenium-manager true
を追加するとドライバを自動的に構成します。 - インストール済みで
PATH
上にあること
- Selenium Manager は、
- 最新リリースからSelenium Server jarファイルをダウンロードしてください
- Gridを起動
java -jar selenium-server-<version>.jar standalone
- WebDriverテストをhttps://:4444に向けてください
- (オプション)ブラウザでhttps://:4444を開いて、実行中のテストと利用可能なケイパビリティを確認してください
*テストをhttps://:4444に向ける方法がわからない?RemoteWebDriver
セクションを確認してください。
さまざまな構成オプションの詳細については、以下のセクションを参照してください。
Gridの役割
Gridは6つの異なるコンポーネントで構成されており、さまざまな方法でデプロイできます。
ニーズに応じて、それぞれを個別に(分散)、ハブとノードにグループ化するか、すべてを1台のマシン(スタンドアロン)で開始できます。
スタンドアロン
スタンドアロンは、すべてのGrid コンポーネントを1つにシームレスに結合します。スタンドアロンモードでGridを実行すると、単一のコマンドで、単一のプロセス内で完全に機能するGridが得られます。スタンドアロンは、単一のマシンでのみ実行できます。
スタンドアロンは、Selenium Gridを起動する最も簡単なモードでもあります。デフォルトでは、サーバーはhttps://:4444でRemoteWebDriver
リクエストをリッスンします。デフォルトでは、サーバーはシステム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://:4444でRemoteWebDriver
リクエストをリッスンします。
ノード
起動時に、ノードはシステム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
フラグが必要です。
たとえば、ハブがポート8886
、8887
、および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を使用する場合、各コンポーネントは個別に起動され、理想的には異なるマシンで起動されます。
- イベントバス:異なるGridコンポーネント間の内部通信を可能にします。
デフォルトポートは:4442
、4443
、および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
- 新しいセッションキュー:ディストリビューターによってクエリされるキューに新しいセッションリクエストを追加します
デフォルトポートは5559
です。
java -jar selenium-server-<version>.jar sessionqueue --port 5559
- セッションマップ:セッション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
- ディストリビューター:新しいセッションリクエストのために新しいセッションキューをクエリし、ケイパビリティが一致する場合にノードに割り当てます。ノードは、ハブ/ノード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
- ルーター:新しいセッションリクエストをキューにリダイレクトし、実行中のセッションリクエストをそのセッションを実行しているノードにリダイレクトします。
デフォルトのルーターポートは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
- ノード
デフォルトのノードポートは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クライアントの使用
デフォルトでは、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のこのブログ投稿を参照してください:グリッドを公開したままにしないでください