外部数据存储

目录

简介

Selenium Grid 允许您将与当前正在运行的会话相关的信息持久化到外部数据存储中。外部数据存储可以由您最喜欢的数据库(或)Redis 缓存系统支持。

设置

  • Coursier - 作为依赖解析器,以便我们可以动态下载 Maven 工件并在类路径中提供它们
  • Docker - 用于管理我们的 PostGreSQL/Redis Docker 容器。

数据库支持的会话映射

为了便于说明,我们将使用 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 实例,则只需使用上述 SQL 语句创建一个名为 selenium_sessions 的数据库和表 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 替换为您的实例的实际主机和端口号。

  • 下面是一个简单的 shell 脚本(我们称之为 distributed.sh),我们将使用它来启动我们的分布式 Grid。
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 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://localhost:4442 \
--subscribe-events tcp://localhost:4443 \
--port 5556 --config sessions.toml 
  • 为了清楚起见,上面脚本中的变量名已替换为它们的实际值。
  • 请记住将 localhost 替换为运行 Event-Bus 的机器的实际主机名。
  • 传递给 coursier 的参数基本上是 GAV(组工件版本)Maven 坐标,即
  • sessions.toml 是我们之前创建的配置文件。

Redis 支持的会话映射

我们将使用 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 缓存实例,请将 localhost6379 替换为您的实例的实际主机和端口号。

  • 下面是一个简单的 shell 脚本(我们称之为 distributed.sh),我们将使用它来启动我们的分布式 Grid。
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 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://localhost:4442 \
--subscribe-events tcp://localhost:4443 \
--port 5556 --config sessions.toml 
  • 为了清楚起见,上面脚本中的变量名已替换为它们的实际值。
  • 请记住将 localhost 替换为运行 Event-Bus 的机器的实际主机名。
  • 传递给 coursier 的参数基本上是 GAV(组工件版本)Maven 坐标,即
  • sessions.toml 是我们之前创建的配置文件。
上次修改时间 2022年11月15日: 外部会话数据存储文档 (#1225) (60943504fb8)