外部資料儲存庫

目錄

簡介

Selenium Grid 允許您將與目前執行中工作階段相關的資訊持久儲存到外部資料儲存庫中。外部資料儲存庫可以使用您喜愛的資料庫或 Redis 快取系統作為後端。

設定

  • Coursier - 作為依賴項解析器,以便我們可以即時下載 Maven Artifacts 並使其在我們的類別路徑中可用
  • Docker - 用於管理我們的 PostGreSQL/Redis Docker 容器。

資料庫支援的 Session Map

為了說明,我們將使用 PostGreSQL 資料庫。

我們將使用 Docker Compose 檔案,以 Docker 容器的形式啟動 PostGreSQL 資料庫。

步驟

如果您已經有可用的 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 資料庫實例,則只需使用上述 SQL 語句建立一個名為 selenium_sessions 的資料庫和名為 sessions_map 的表格即可。

  • 建立一個名為 sessions.toml 的 Selenium Grid 配置檔案,內容如下
[sessions]
implementation = "org.openqa.selenium.grid.sessionmap.jdbc.JdbcBackedSessionMap"
jdbc-url = "jdbc:postgresql://#:5432/selenium_sessions"
jdbc-user = "seluser"
jdbc-password = "seluser"

注意: 如果您計劃使用現有的 PostGreSQL DB 實例,請將 localhost:5432 替換為您的實例的實際主機和埠號。

  • 以下是一個簡單的 Shell 腳本(我們稱之為 distributed.sh),我們將使用它來啟動我們的分散式 Grid。
SE_VERSION=<current_selenium_version>
JAR_NAME=selenium-server-${SE_VERSION}.jar
PUBLISH="--publish-events tcp://#:4442"
SUBSCRIBE="--subscribe-events tcp://#:4443"
SESSIONS="--sessions https://#:5556"
SESSIONS_QUEUE="--sessionqueue https://#: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 https://#: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 Shell 腳本來啟動 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://#:4442 \
--subscribe-events tcp://#:4443 \
--port 5556 --config sessions.toml 
  • 為了清楚起見,上述腳本中的變數名稱已替換為其實際值。
  • 請記住將 localhost 替換為執行 Event-Bus 的機器的實際主機名稱。
  • 傳遞給 coursier 的引數基本上是以下 Maven 座標的 GAV(群組 Artifact 版本)
    • selenium-session-map-jdbc,這是幫助我們將工作階段資訊儲存在資料庫中所需的項目
    • postgresql,這是幫助我們與 PostGreSQL 資料庫通訊所需的項目。
  • sessions.toml 是我們稍早建立的配置檔案。

Redis 支援的 Session Map

我們將使用 Docker Compose 檔案,以 Docker 容器的形式啟動 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 快取實例,請將 localhost6379 替換為您的實例的實際主機和埠號。

  • 以下是一個簡單的 Shell 腳本(我們稱之為 distributed.sh),我們將使用它來啟動我們的分散式 Grid。
SE_VERSION=<current_selenium_version>
JAR_NAME=selenium-server-${SE_VERSION}.jar
PUBLISH="--publish-events tcp://#:4442"
SUBSCRIBE="--subscribe-events tcp://#:4443"
SESSIONS="--sessions https://#:5556"
SESSIONS_QUEUE="--sessionqueue https://#: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 https://#:5553 $SESSIONS_QUEUE --port 4444 &
echo 'Starting Node'
java -jar $JAR_NAME node $PUBLISH $SUBSCRIBE &
  • 此時,目前目錄應包含以下檔案

    • docker-compose.yml
    • sessions.toml
    • distributed.sh
  • 您現在可以透過執行 distributed.sh Shell 腳本來啟動 Grid,並快速執行測試。您會注意到 Grid 現在將工作階段資訊儲存到 Redis 實例中。您可以考慮使用 Redis GUI(例如 TablePlus)來查看它們(請確保您已在測試中設定偵錯點,因為這些值會在測試完成後立即被刪除)。

在機器上啟動 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://#:4442 \
--subscribe-events tcp://#:4443 \
--port 5556 --config sessions.toml 
  • 為了清楚起見,上述腳本中的變數名稱已替換為其實際值。
  • 請記住將 localhost 替換為執行 Event-Bus 的機器的實際主機名稱。
  • 傳遞給 coursier 的引數基本上是以下 Maven 座標的 GAV(群組 Artifact 版本)
  • sessions.toml 是我們稍早建立的配置檔案。
上次修改日期:2022 年 11 月 15 日:外部工作階段資料儲存庫的文件 (#1225) (60943504fb8)