外部データストア
目次
はじめに
Selenium Grid を使用すると、現在実行中のセッションに関連する情報を外部データストアに永続化できます。外部データストアは、お好みのデータベースまたは Redis キャッシュシステムでバックアップできます。
セットアップ
- Coursier - 依存関係解決ツールとして、Mavenアーティファクトをオンザフライでダウンロードし、クラスパスで使用できるようにします。
- Docker - PostGreSQL/Redis Dockerコンテナを管理するため。
データベース backed Session Map
この説明では、PostGreSQL データベースを使用します。
Docker Compose ファイルを使用して、PostGreSQL データベースを Docker コンテナとして起動します。
手順
PostGreSQL データベースインスタンスが既にある場合は、この手順をスキップできます。
init.sql
という名前の SQL ファイルを以下の内容で作成します。
CREATE TABLE IF NOT EXISTS sessions_map(
session_ids varchar(256),
session_caps text,
session_uri varchar(256),
session_stereotype text,
session_start varchar(256)
);
init.sql
と同じディレクトリに、docker-compose.yml
という名前のファイルを以下の内容で作成します。
version: '3.8'
services:
db:
image: postgres:9.6-bullseye
restart: always
environment:
- POSTGRES_USER=seluser
- POSTGRES_PASSWORD=seluser
- POSTGRES_DB=selenium_sessions
ports:
- "5432:5432"
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
次のコマンドを実行して、データベースコンテナを起動できます。
docker-compose up -d
データベース名は selenium_sessions
で、ユーザー名とパスワードは seluser
に設定されています。
既に実行中の PostGreSQL DB インスタンスを使用している場合は、selenium_sessions
という名前のデータベースと、上記の SQL ステートメントを使用して sessions_map
テーブルを作成するだけで済みます。
sessions.toml
という名前の Selenium Grid 構成ファイルを以下の内容で作成します。
[sessions]
implementation = "org.openqa.selenium.grid.sessionmap.jdbc.JdbcBackedSessionMap"
jdbc-url = "jdbc:postgresql://localhost:5432/selenium_sessions"
jdbc-user = "seluser"
jdbc-password = "seluser"
注: 既存の PostGreSQL DB インスタンスを使用する場合は、localhost:5432
をインスタンスの実際のホスト名とポート番号に置き換えてください。
- 以下は、分散Gridを起動するために使用する簡単なシェルスクリプト (
distributed.sh
と呼びましょう) です。
SE_VERSION=<current_selenium_version>
JAR_NAME=selenium-server-${SE_VERSION}.jar
PUBLISH="--publish-events tcp://localhost:4442"
SUBSCRIBE="--subscribe-events tcp://localhost:4443"
SESSIONS="--sessions http://localhost:5556"
SESSIONS_QUEUE="--sessionqueue http://localhost:5559"
echo 'Starting Event Bus'
java -jar $JAR_NAME event-bus $PUBLISH $SUBSCRIBE --port 5557 &
echo 'Starting New Session Queue'
java -jar $JAR_NAME sessionqueue --port 5559 &
echo 'Starting Sessions Map'
java -jar $JAR_NAME \
--ext $(coursier fetch -p org.seleniumhq.selenium:selenium-session-map-jdbc:${SE_VERSION} org.postgresql:postgresql:42.3.1) \
sessions $PUBLISH $SUBSCRIBE --port 5556 --config sessions.toml &
echo 'Starting Distributor'
java -jar $JAR_NAME distributor $PUBLISH $SUBSCRIBE $SESSIONS $SESSIONS_QUEUE --port 5553 --bind-bus false &
echo 'Starting Router'
java -jar $JAR_NAME router $SESSIONS --distributor http://localhost:5553 $SESSIONS_QUEUE --port 4444 &
echo 'Starting Node'
java -jar $JAR_NAME node $PUBLISH $SUBSCRIBE &
この時点で、現在のディレクトリには次のファイルが含まれている必要があります。
docker-compose.yml
init.sql
sessions.toml
distributed.sh
distributed.sh
シェルスクリプトを実行して Grid を起動し、すぐにテストを実行できます。Grid がセッション情報を PostGreSQL データベースに保存するようになったことがわかります。
マシン上で SessionMap
を生成する行で
export SE_VERSION=<current_selenium_version>
java -jar selenium-server-${SE_VERSION}.jar \
--ext $(coursier fetch -p org.seleniumhq.selenium:selenium-session-map-jdbc:${SE_VERSION} org.postgresql:postgresql:42.3.1) \
sessions --publish-events tcp://localhost:4442 \
--subscribe-events tcp://localhost:4443 \
--port 5556 --config sessions.toml
- 上記のスクリプトの変数名は、わかりやすくするために実際の値に置き換えられています。
localhost
を、Event-Bus が実行されているマシンの実際のホスト名に置き換えることを忘れないでください。- coursier に渡される引数は、基本的に GAV (Group Artifact Version) Maven 座標です。
- selenium-session-map-jdbc これは、データベースにセッション情報を保存するために必要です
- postgresql これは、PostGreSQL データベースと通信するために必要です。
sessions.toml
は、以前に作成した構成ファイルです。
Redis backed Session Map
Docker Compose ファイルを使用して、Redis キャッシュ Docker コンテナを起動します。
手順
Redis キャッシュインスタンスが既にある場合は、この手順をスキップできます。
docker-compose.yml
という名前のファイルを以下の内容で作成します。
version: '3.8'
services:
redis:
image: redis:bullseye
restart: always
ports:
- "6379:6379"
次のコマンドを実行して、Redis コンテナを起動できます。
docker-compose up -d
sessions.toml
という名前の Selenium Grid 構成ファイルを以下の内容で作成します。
[sessions]
scheme = "redis"
implementation = "org.openqa.selenium.grid.sessionmap.redis.RedisBackedSessionMap"
hostname = "localhost"
port = 6379
注: 既存の Redis キャッシュインスタンスを使用する場合は、localhost
と 6379
をインスタンスの実際のホスト名とポート番号に置き換えてください。
- 以下は、分散グリッドを起動するために使用する簡単なシェルスクリプト (
distributed.sh
と呼びましょう) です。
SE_VERSION=<current_selenium_version>
JAR_NAME=selenium-server-${SE_VERSION}.jar
PUBLISH="--publish-events tcp://localhost:4442"
SUBSCRIBE="--subscribe-events tcp://localhost:4443"
SESSIONS="--sessions http://localhost:5556"
SESSIONS_QUEUE="--sessionqueue http://localhost:5559"
echo 'Starting Event Bus'
java -jar $JAR_NAME event-bus $PUBLISH $SUBSCRIBE --port 5557 &
echo 'Starting New Session Queue'
java -jar $JAR_NAME sessionqueue --port 5559 &
echo 'Starting Session Map'
java -jar $JAR_NAME \
--ext $(coursier fetch -p org.seleniumhq.selenium:selenium-session-map-redis:${SE_VERSION}) \
sessions $PUBLISH $SUBSCRIBE --port 5556 --config sessions.toml &
echo 'Starting Distributor'
java -jar $JAR_NAME distributor $PUBLISH $SUBSCRIBE $SESSIONS $SESSIONS_QUEUE --port 5553 --bind-bus false &
echo 'Starting Router'
java -jar $JAR_NAME router $SESSIONS --distributor http://localhost:5553 $SESSIONS_QUEUE --port 4444 &
echo 'Starting Node'
java -jar $JAR_NAME node $PUBLISH $SUBSCRIBE &
この時点で、現在のディレクトリには次のファイルが含まれている必要があります。
docker-compose.yml
sessions.toml
distributed.sh
distributed.sh
シェルスクリプトを実行して Grid を起動し、すぐにテストを実行できます。Grid がセッション情報を Redis インスタンスに保存するようになったことがわかります。TablePlus などの Redis GUI を使用してそれらを確認できます (テストが完了するとすぐに値が削除されるため、テストにデバッグポイントを設定していることを確認してください)。
マシン上で SessionMap
を生成する行で
export SE_VERSION=<current_selenium_version>
java -jar selenium-server-${SE_VERSION}.jar \
--ext $(coursier fetch -p org.seleniumhq.selenium:selenium-session-map-redis:${SE_VERSION}) \
sessions --publish-events tcp://localhost:4442 \
--subscribe-events tcp://localhost:4443 \
--port 5556 --config sessions.toml
- 上記のスクリプトの変数名は、わかりやすくするために実際の値に置き換えられています。
localhost
を、Event-Bus が実行されているマシンの実際のホスト名に置き換えることを忘れないでください。- coursier に渡される引数は、基本的に GAV (Group Artifact Version) Maven 座標です。
- selenium-session-map-redis これは、Redis キャッシュにセッション情報を保存するために必要です。
sessions.toml
は、以前に作成した構成ファイルです。