Selenium Grid の CLI オプション

すべての Grid コンポーネントの設定 CLI オプションの詳細。

Grid を構成するために、さまざまなセクションが用意されています。各セクションには、コマンドライン引数を通じて構成できるオプションがあります。

コンポーネントとセクションのマッピングの完全な説明は、以下をご覧ください。

オプションが変更または追加されたにもかかわらず、まだ文書化されていない場合、このドキュメントは古くなっている可能性があることに注意してください。このような状況に遭遇した場合は、「設定ヘルプ」セクションを確認し、このページを更新するプルリクエストを送信してください。

セクション

スタンドアロンハブノードディストリビュータルーターセッションSessionQueue
ディストリビュータ
Docker
イベント
ログ
ネットワーク
ノード
ルーター
リレー
サーバ
SessionQueue
セッション

ディストリビュータ

オプションタイプ値/例説明
--healthcheck-intervalint120ノードのヘルスチェックをすべてのノードに対して実行する頻度(秒単位)。これにより、サーバがすべてのノードに正常に ping できることが保証されます。
--distributorurihttp://localhost:5553ディストリビュータの URL。
--distributor-hoststringlocalhostディストリビュータがリッスンしているホスト。
--distributor-implementationstringorg.openqa.selenium.grid.distributor.local.LocalDistributorデフォルト以外のディストリビュータ実装の完全修飾クラス名
--distributor-portint5553ディストリビュータがリッスンしているポート。
--reject-unsupported-capsbooleanfalseGrid が要求されたケイパビリティをサポートしていない場合、ディストリビュータがリクエストをすぐに拒否できるようにします。リクエストをすぐに拒否することは、オンデマンドでノードを起動しない Grid セットアップに適しています。
--slot-matcherstringorg.openqa.selenium.grid.data.DefaultSlotMatcher使用するデフォルト以外のスロットマッチャーの完全修飾クラス名。これは、ノードが特定のセッションをサポートできるかどうかを判断するために使用されます。
--slot-selectorstringorg.openqa.selenium.grid.distributor.selector.DefaultSlotSelectorデフォルト以外のスロットセレクタの完全修飾クラス名。これは、ノードが一致した後、ノード内のスロットを選択するために使用されます。
--newsession-threadpool-sizeint24ディストリビュータは、キューから新しいセッションリクエストを消費するときに、固定サイズのスレッドプールを使用して新しいセッションを作成します。これにより、スレッドプールのサイズを構成できます。デフォルト値は、利用可能なプロセッサ数 * 3 です。注: スレッド数が利用可能なプロセッサ数よりも大幅に多い場合、常にパフォーマンスが向上するとは限りません。スレッド数が多いと、コンテキストスイッチングが多くなり、これはコストのかかる操作になります。

Docker

オプションタイプ値/例説明
--docker-assets-pathstring/opt/selenium/assetsアセットが保存される絶対パス
--docker-string[]selenium/standalone-firefox:latest '{"browserName": "firefox"}'イメージ名をステレオタイプケイパビリティにマッピングする Docker 構成 (例: `-D selenium/standalone-firefox:latest ‘{“browserName”: “firefox”}’`)
--docker-devicesstring[]/dev/kvm:/dev/kvmデバイスをコンテナに公開します。各デバイスマッピング宣言には、ホストとコンテナの両方のデバイスパスがコロンで区切られている必要があります。例: /device/path/in/host:/device/path/in/container
--docker-hoststringlocalhostDocker デーモンが実行されているホスト名
--docker-portint2375Docker デーモンが実行されているポート
--docker-urlstringhttp://localhost:2375Docker デーモンに接続するための URL
--docker-video-imagestringselenium/video:latestビデオ録画が有効になっている場合に使用する Docker イメージ
--docker-host-config-keysstring[]Dns DnsOptions DnsSearch ExtraHosts Bindsブラウザコンテナに渡す必要がある Docker ホスト構成キーを指定します。キー名は Docker API ドキュメント、または node-docker コンテナに対して docker inspect を実行することで確認できます。

イベント

オプションタイプ値/例説明
--bind-busbooleanfalse接続文字列をバインドするか、接続するかどうか。
true の場合、コンポーネントはイベントバスにバインドされます (イベントバスはコンポーネント、通常はディストリビュータとハブによっても起動されます)。
false の場合、コンポーネントはイベントバスに接続されます。
--events-implementationstringorg.openqa.selenium.events.zeromq.ZeroMqEventBusデフォルト以外のイベントバス実装の完全修飾クラス名
--publish-eventsstringtcp://*:4442イベントバスにイベントをパブリッシュするための接続文字列
--subscribe-eventsstringtcp://*:4443イベントバスからイベントをサブスクライブするための接続文字列

ログ

オプションタイプ値/例説明
--http-logsbooleanfalseHTTP ロギングを有効にします。HTTP ログを記録するには、トレースを有効にする必要があります。
--log-encodingstringUTF-8ログエンコーディング
--logstringWindows パスの例
'\path\to\file\gridlog.log'
または
'C:\path\path\to\file\gridlog.log'

Linux/Unix/MacOS パスの例
'/path/to/file/gridlog.log'
ログを書き出すファイル。ファイルパスがオペレーティングシステムのファイルパスと互換性があることを確認してください。
--log-levelstring“INFO”ログレベル。デフォルトのログレベルは INFO です。ログレベルの詳細はこちらをご覧ください https://docs.oracle.com/javase/7/docs/api/java/util/logging/Level.html
--plain-logsbooleantrueプレーンログ行を使用する
--structured-logsbooleanfalse構造化ログを使用する
--tracingbooleantrueトレース収集を有効にする
--log-timestamp-formatstringHH:mm:ss.SSSログタイムスタンプ形式を構成できます

ネットワーク

オプションタイプ値/例説明
--relax-checksbooleanfalse厳密な W3C 仕様への準拠に反して、受信リクエストの origin ヘッダーとコンテンツタイプのチェックを緩和します。

ノード

オプションタイプ値/例説明
--detect-driversbooleantrue現在のシステムで利用可能なドライバを自動検出して、ノードに追加します。
--driver-configurationstring[]display-name="Firefox Nightly" max-sessions=2 webdriver-path="/usr/local/bin/geckodriver" stereotype="{\"browserName\": \"firefox\", \"browserVersion\": \"86\", \"moz:firefoxOptions\": {\"binary\":\"/Applications/Firefox Nightly.app/Contents/MacOS/firefox-bin\"}}"ノードがサポートする構成済みドライバのリスト。可読性を向上させるために、このタイプの構成を toml 構成ファイルで提供することをお勧めします。
--driver-factorystring[]org.openqa.selenium.example.LynxDriverFactory '{"browserName": "lynx"}'完全修飾クラス名と、これに一致するブラウザ構成のマッピング。
--driver-implementationstring[]"firefox"チェックする必要があるドライバ。指定された場合、自動構成はスキップされます。
--node-implementationstring"org.openqa.selenium.grid.node.local.LocalNodeFactory"デフォルト以外のノード実装の完全修飾クラス名。これは、セッションのライフサイクルを管理するために使用されます。
--grid-urlstringhttps://grid.example.comGrid 全体の公開 URL (通常はハブまたはルーターのアドレス)
--heartbeat-periodint60ノードが稼働していることをディストリビュータに通知するために、ノードがハートビートイベントをディストリビュータに送信する頻度(秒単位)。
--max-sessionsint8同時セッションの最大数。デフォルト値は、利用可能なプロセッサ数です。
--override-max-sessionsbooleanfalse利用可能なプロセッサの数は、推奨される最大セッション値です (プロセッサあたり 1 ブラウザセッション)。このフラグを true に設定すると、推奨される最大値を上書きできます。ホストのリソースが不足する可能性があるため、セッションの安定性と信頼性が損なわれる可能性があります。
--register-cycleint10ノードが最初にディストリビュータに自身を登録しようとする頻度(秒単位)。
--register-periodint120ノードが最初にディストリビュータに登録しようとする期間(秒単位)。この期間が完了すると、ノードは再度登録を試行しません。
--session-timeoutint300X をセッションタイムアウト(秒単位)とします。ノードは、過去 X 秒間アクティビティがなかったセッションを自動的に強制終了します。これにより、他のテストのためにスロットが解放されます。
--vnc-env-varstring[]SE_START_XVFB SE_START_VNC SE_START_NO_VNCVNC ストリームが利用可能かどうかを判断するために確認する環境変数。
--no-vnc-portint7900VNC が利用可能な場合、ローカル noVNC ストリームを取得できるポートを設定します
--drain-after-session-countint1X セッションが実行された後、ノードをドレインしてシャットダウンします。Kubernetes のような環境に役立ちます。ゼロより大きい値はこの機能を有効にします。
--hubstringhttp://localhost:4444ハブアンドノード構成のハブのアドレス。ホスト名または IP アドレス (hostname) を指定できます。この場合、ハブは http://hostname:4444 であると想定され、--grid-url は同じ --publish-eventstcp://hostname:4442--subscribe-eventstcp://hostname:4443 になります。hostname にポート番号が含まれている場合、それは --grid-url に使用されますが、イベントバスの URI は同じままです。これらのデフォルト値はいずれも、正しいフラグを設定することで上書きできます。ホスト名にプロトコル (https など) が含まれている場合、それも使用されます。
--enable-cdpbooleantrueGrid で CDP プロキシを有効にします。Grid 管理者は、ネットワークが WebSocket を許可しない場合、CDP を無効にできます。デフォルトは True です。
--enable-managed-downloadsbooleanfalseこれにより、ノードはノード上の特定のセッション用にダウンロードされたファイルを自動管理します。
--selenium-managerbooleanfalseドライバが現在のシステムで利用できない場合は、Selenium Manager を使用します。デフォルトは False です。
--connection-limit-per-sessionint10X をセッションあたりの WebSocket 接続の最大数とします。これにより、1 つのセッションがホストの接続制限を使い果たすことがなくなります。

リレー

オプションタイプ値/例説明
--service-urlstringhttp://localhost:4723Appium サーバやクラウドサービスなど、WebDriver コマンドをサポートするサービスに接続するための URL。
--service-hoststringlocalhostWebDriver コマンドをサポートするサービスが実行されているホスト名
--service-portint4723WebDriver コマンドをサポートするサービスが実行されているポート
--service-status-endpointstring/statusオプション。WebDriver サービスステータスをクエリするエンドポイント。HTTP 200 レスポンスが予期されます
--service-protocol-versionstringHTTP/1.1オプション。エンドポイントサービスステータスと通信するときに、HttpClient で特定のプロトコルバージョンを強制します
--service-configurationstring[]max-sessions=2 stereotype='{"browserName": "safari", "platformName": "iOS", "appium:platformVersion": "14.5"}}'呼び出しがリレーされるサービスの設定。可読性を向上させるために、このタイプの構成を toml 構成ファイルで提供することをお勧めします。

ルーター

オプションタイプ値/例説明
--passwordstringmyStrongPasswordクライアントがサーバに接続するために使用する必要があるパスワード。これとユーザー名の両方を設定する必要があります。
--usernamestringadminクライアントがサーバに接続するために使用する必要があるユーザー名。これとパスワードの両方を設定する必要があります。
--sub-pathstringmy_company/selenium_gridハブ/ルーター/スタンドアロンのすべてのユーザー向けルートで考慮する必要があるサブパス。
--disable-uibooleantrueGrid UI を無効にします。

サーバ

オプションタイプ値/例説明
--external-urlstringhttp://10.0.1.1:33333コンポーネントが一般的に利用可能な外部 URL。コンポーネントが異なるネットワーク上にあり、プロキシサーバが関与している複雑なネットワークトポロジで役立ちます。
--allow-corsbooleantrueSelenium サーバが任意のホストからの Web ブラウザ接続を許可するかどうか
--hoststringlocalhostサーバ IP またはホスト名: 通常は自動的に決定されます。
--bind-hostbooleantrueサーバをホストアドレス/名にバインドするか、または到達可能な URL を報告するためだけに使用するかどうか。サーバが現在の IP/ホスト名ではなく、外部 IP またはホスト名 (Docker コンテナ内など) で自身を報告できない複雑なネットワークトポロジで役立ちます
--https-certificatepath/path/to/cert.pemhttps 用のサーバ証明書。「java -jar selenium-server.jar info security」を実行して、より詳細な情報を取得してください
--https-private-keypath/path/to/key.pkcs8https 用の秘密鍵。「java -jar selenium-server.jar info security」を実行して、より詳細な情報を取得してください
--max-threadsint24リスナースレッドの最大数。デフォルト値は (利用可能なプロセッサ数) * 3 です。
--portint4444リッスンするポート。このパラメータは、ルーター/ハブ/スタンドアロンは 4444 を使用し、ノードは 5555 を使用するなど、コンポーネントによって使用されるため、デフォルトはありません。

SessionQueue

オプションタイプ値/例説明
--sessionqueueurihttp://localhost:1237セッションキューサーバのアドレス。
-sessionqueue-hoststringlocalhostセッションキューサーバがリッスンしているホスト。
--sessionqueue-portint1234セッションキューサーバがリッスンしているポート。
--session-request-timeoutint300タイムアウト(秒単位)。新しい着信セッションリクエストがキューに追加されます。キューに設定時間より長く置かれているリクエストはタイムアウトします。
--session-retry-intervalint5再試行間隔(秒単位)。すべてのスロットがビジーの場合、新しいセッションリクエストは指定された間隔後に再試行されます。

セッション

オプションタイプ値/例説明
--sessionsurihttp://localhost:1234セッションマップサーバのアドレス。
--sessions-hoststringlocalhostセッションマップサーバがリッスンしているホスト。
--sessions-portint1234セッションマップサーバがリッスンしているポート。

構成例

上記のすべてのオプションは、Grid コンポーネントを起動するときに使用できます。これらは、Grid オプションを探索し、適切な構成を見つけるために値を試すのに適した方法です。

Grid を構成するには、Toml ファイルを使用することをお勧めします。構成ファイルは可読性を向上させ、ソース管理でチェックすることもできます。

必要な場合は、Toml ファイル構成と CLI 引数を組み合わせることができます。

コマンドラインフラグ

構成オプションをコマンドラインフラグとして渡すには、コンポーネントの有効なオプションを特定し、以下のテンプレートに従ってください。

java -jar selenium-server-<version>.jar <component> --<option> value

スタンドアロン、最大セッション数とメインポートの設定

java -jar selenium-server-<version>.jar standalone --max-sessions 4 --port 4444

ハブ、新しいセッションリクエストタイムアウト、メインポートの設定、トレースの無効化

java -jar selenium-server-<version>.jar hub --session-request-timeout 500 --port 3333 --tracing false

ノード、最大セッション数 4、debug(fine) ログ、ポート 7777、Firefox と Edge のみ

java -jar selenium-server-<version>.jar node --max-sessions 4 --log-level "fine" --port 7777 --driver-implementation "firefox" --driver-implementation "edge"

ディストリビュータ、セッションマップサーバ URL、セッションキューサーバ URL の設定、バスの無効化

java -jar selenium-server-<version>.jar distributor --sessions http://localhost:5556 --sessionqueue http://localhost:5559 --bind-bus false

特定のノードを一致させるためのカスタムケイパビリティの設定

重要: カスタムケイパビリティは、すべてのノードの構成で設定する必要があります。また、すべてのセッションリクエストに常に含める必要があります。

ハブを起動
java -jar selenium-server-<version>.jar hub
カスタムキャップを true に設定してノード A を起動
java -jar selenium-server-<version>.jar node --detect-drivers false --driver-configuration display-name="Chrome (custom capability true)" max-sessions=1 stereotype='{"browserName":"chrome","gsg:customcap":true}' --port 6161
カスタムキャップを false に設定してノード B を起動
java -jar selenium-server-<version>.jar node --detect-drivers false --driver-configuration display-name="Chrome (custom capability true)" max-sessions=1 stereotype='{"browserName":"chrome","gsg:customcap":false}' --port 6262
ノード A のマッチング
ChromeOptions options = new ChromeOptions();
options.setCapability("gsg:customcap", true);
WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444"), options);
driver.get("https://selenium.dokyumento.jp");
driver.quit();

ノード B に一致させるには、カスタムケイパビリティを false に設定します。

ノードによる管理対象ダウンロードの有効化

テストによっては、ノード上でダウンロードされたファイルにアクセスする必要がある場合があります。このようなファイルを取得するには、以下を実行できます。

ハブを起動
java -jar selenium-server-<version>.jar hub
管理対象ダウンロードを有効にしてノードを起動する
java -jar selenium-server-<version>.jar node --enable-managed-downloads true
テストレベルでケイパビリティを設定する

この機能を使用するテストは、ケイパビリティ "se:downloadsEnabled"true に設定する必要があります

options.setCapability("se:downloadsEnabled", true);
仕組み
  • Grid インフラストラクチャは、"--enable-managed-downloads true" で起動されたノード *のみ* に対して、"se:downloadsEnabled" を持つセッションリクエストを一致させようとします。
  • セッションが一致した場合、ノードはブラウザにファイルのダウンロード先を知らせるために必要なケイパビリティを自動的に設定します。
  • ノードはユーザーが次のことを許可するようになりました
    • 特定のセッション用にダウンロードされたすべてのファイルをリスト表示し、
    • ファイルリストから特定のファイルを取得します。
  • 特定のセッション用にファイルがダウンロードされたディレクトリは、セッションが終了したとき、または非アクティブのためにタイムアウトしたときに自動的にクリーンアップされます。

注: 現在、このケイパビリティは *のみ* サポートされています

  • Edge
  • Firefox および
  • Chrome ブラウザ
現在のセッションでダウンロードできるファイルをリスト表示する
  • GET 元のエンドポイントは /session/<sessionId>/se/files です。
  • コマンドを機能させるには、セッションがアクティブである必要があります。
  • 生のレスポンスは以下のようになります
{
  "value": {
    "names": [
      "Red-blue-green-channel.jpg"
    ]
  }
}

レスポンスでは、ファイル名のリストはキー names の下に表示されます。

ファイルのダウンロード
  • POST 元のエンドポイントは /session/<sessionId>/se/files で、ペイロードの形式は {"name": "fileNameGoesHere} です
  • コマンドを機能させるには、セッションがアクティブである必要があります。
  • 生のレスポンスは以下のようになります
{
	"value": {
		"filename": "Red-blue-green-channel.jpg",
		"contents": "Base64EncodedStringContentsOfDownloadedFileAsZipGoesHere"
	}
}
  • レスポンス BLOB には 2 つのキーが含まれています。
    • filename - ダウンロードされたファイル名。
    • contents - ファイルの Base64 エンコードされた圧縮コンテンツ。
  • ファイルコンテンツは Base64 エンコードされており、解凍する必要があります。
ダウンロードできるファイルをリスト表示する

以下に示す curl の例は、現在のセッションでノードによってダウンロードされ、ローカルで取得できるすべてのファイルをリスト表示するために使用できます。

curl -X GET "http://localhost:4444/session/90c0149a-2e75-424d-857a-e78734943d4c/se/files"

レスポンスのサンプルは以下のようになります

{
  "value": {
    "names": [
      "Red-blue-green-channel.jpg"
    ]
  }
}
ダウンロードしたファイルを取得する

ダウンロードしたファイルの名前が Red-blue-green-channel.jpg であると仮定して、curl を使用すると、次のコマンドでファイルをダウンロードできます

curl -H "Accept: application/json" \
-H "Content-Type: application/json; charset=utf-8" \
-X POST -d '{"name":"Red-blue-green-channel.jpg"}' \
"http://localhost:4444/session/18033434-fa4f-4d11-a7df-9e6d75920e19/se/files"

レスポンスのサンプルは以下のようになります

{
  "value": {
    "filename": "Red-blue-green-channel.jpg",
    "contents": "UEsDBBQACAgIAJpagVYAAAAAAAAAAAAAAAAaAAAAUmVkLWJsAAAAAAAAAAAAUmVkLWJsdWUtZ3JlZW4tY2hhbm5lbC5qcGdQSwUGAAAAAAEAAQBIAAAAcNkAAAAA"
  }
}
Java の完全なサンプルコード

以下は、次の処理を行う Java の例です

  • テストでダウンロードされたファイルの自動管理が必要であることを示すケイパビリティを設定します。
  • ブラウザ経由でファイルのダウンロードをトリガーします。
  • リモートノードから取得可能なファイルをリスト表示します (これらは本質的に現在のセッションでダウンロードされたファイルです)
  • 1 つのファイルを選択し、リモートノードからローカルマシンにファイルをダウンロードします。
import com.google.common.collect.ImmutableMap;

import org.openqa.selenium.By;
import org.openqa.selenium.io.Zip;
import org.openqa.selenium.json.Json;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.http.HttpClient;
import org.openqa.selenium.remote.http.HttpRequest;
import org.openqa.selenium.remote.http.HttpResponse;

import java.io.File;
import java.net.URL;
import java.nio.file.Files;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.concurrent.TimeUnit;

import static org.openqa.selenium.remote.http.Contents.asJson;
import static org.openqa.selenium.remote.http.Contents.string;
import static org.openqa.selenium.remote.http.HttpMethod.GET;
import static org.openqa.selenium.remote.http.HttpMethod.POST;

public class DownloadsSample {

  public static void main(String[] args) throws Exception {
    // Assuming the Grid is running locally.
    URL gridUrl = new URL("http://localhost:4444");
    ChromeOptions options = new ChromeOptions();
    options.setCapability("se:downloadsEnabled", true);
    RemoteWebDriver driver = new RemoteWebDriver(gridUrl, options);
    try {
      demoFileDownloads(driver, gridUrl);
    } finally {
      driver.quit();
    }
  }

	private static void demoFileDownloads(RemoteWebDriver driver, URL gridUrl) throws Exception {
		driver.get("https://selenium.dokyumento.jp/selenium/web/downloads/download.html");
		// Download the two available files on the page
		driver.findElement(By.id("file-1")).click();
		driver.findElement(By.id("file-2")).click();

		// The download happens in a remote Node, which makes it difficult to know when the file
		// has been completely downloaded. For demonstration purposes, this example uses a
		// 10-second sleep which should be enough time for a file to be downloaded.
		// We strongly recommend to avoid hardcoded sleeps, and ideally, to modify your
		// application under test, so it offers a way to know when the file has been completely
		// downloaded.
		TimeUnit.SECONDS.sleep(10);

		//This is the endpoint which will provide us with list of files to download and also to
		//let us download a specific file.
		String downloadsEndpoint = String.format("/session/%s/se/files", driver.getSessionId());

		String fileToDownload;

		try (HttpClient client = HttpClient.Factory.createDefault().createClient(gridUrl)) {
			// To list all files that are were downloaded on the remote node for the current session
			// we trigger GET request.
			HttpRequest request = new HttpRequest(GET, downloadsEndpoint);
			HttpResponse response = client.execute(request);
			Map<String, Object> jsonResponse = new Json().toType(string(response), Json.MAP_TYPE);
			@SuppressWarnings("unchecked")
			Map<String, Object> value = (Map<String, Object>) jsonResponse.get("value");
			@SuppressWarnings("unchecked")
			List<String> names = (List<String>) value.get("names");
			// Let's say there were "n" files downloaded for the current session, we would like
			// to retrieve ONLY the first file.
			fileToDownload = names.get(0);
		}

		// Now, let's download the file
		try (HttpClient client = HttpClient.Factory.createDefault().createClient(gridUrl)) {
			// To retrieve a specific file from one or more files that were downloaded by the current session
			// on a remote node, we use a POST request.
			HttpRequest request = new HttpRequest(POST, downloadsEndpoint);
			request.setContent(asJson(ImmutableMap.of("name", fileToDownload)));
			HttpResponse response = client.execute(request);
			Map<String, Object> jsonResponse = new Json().toType(string(response), Json.MAP_TYPE);
			@SuppressWarnings("unchecked")
			Map<String, Object> value = (Map<String, Object>) jsonResponse.get("value");
			// The returned map would contain 2 keys,
			// filename - This represents the name of the file (same as what was provided by the test)
			// contents - Base64 encoded String which contains the zipped file.
			String zippedContents = value.get("contents").toString();
			// The file contents would always be a zip file and has to be unzipped.
			File downloadDir = Zip.unzipToTempDir(zippedContents, "download", "");
			// Read the file contents
			File downloadedFile = Optional.ofNullable(downloadDir.listFiles()).orElse(new File[]{})[0];
			String fileContent = String.join("", Files.readAllLines(downloadedFile.toPath()));
			System.out.println("The file which was "
					+ "downloaded in the node is now available in the directory: "
					+ downloadDir.getAbsolutePath() + " and has the contents: " + fileContent);
		}
	}


}