Docker Compose 不会启动 Selenium Grid

标签 docker docker-compose selenium-grid

我有以下 Docker Compose 文件

version: "3"

services:
  selenium-hub:
    image: selenium/hub
    container_name: selenium-hub
    ports:
      - "4444:4444"
  chrome:
    image: selenium/node-chrome
    depends_on:
      - selenium-hub
    environment:
      - HUB_PORT_4444_TCP_ADDR=selenium-hub
      - HUB_PORT_4444_TCP_PORT=4444
  firefox:
    image: selenium/node-firefox
    depends_on:
      - selenium-hub
    environment:
      - HUB_PORT_4444_TCP_ADDR=selenium-hub
      - HUB_PORT_4444_TCP_PORT=4444
  devenv:
    build: .
    ports:
      - "4444:4444"

当我运行 Docker Compose 文件时没有:

  devenv:
    build: .
    ports:
      - "4444:4444"

它工作正常,Selenium Grid 将成功站立。然而,当我引入此服务时,网格将无法站立,测试将尝试运行,但当然没有网格,因此它将失败。

我哪里出错了?

构建时调用的 Docker 文件。

FROM maven
RUN apt update
COPY . /

RUN mvn clean test

error message: org.openqa.selenium.remote.UnreachableBrowserException: Could not start a new session. Possible causes are invalid address of the remote server or browser start-up failure.

最佳答案

我建议您按照以下步骤操作 -

先决条件:

  • Java-8
  • Docker 桌面客户端
  • UI 测试项目

假设您的测试项目使用 TestNG 来运行其 selenium 脚本。

第 1 步:修改您的 BaseTest 或 Test 启动类以初始化 RemoteWebDriver。

将以下代码替换或添加到您的 BaseTest 或浏览器驱动程序初始化发生的任何位置。

 @BeforeTest
  public void beforeTestSetup() throws MalformedURLException {

    MutableCapabilities dc = new ChromeOptions();

    host = System.getenv("HUB_HOST") != null ? System.getenv("HUB_HOST") : "hub";

    driver.set(new RemoteWebDriver(new URL("http://" + host + ":4444/wd/hub"), dc));

    logger.info("Remote Chrome Driver Started...");

    driver.get().manage().deleteAllCookies();
    driver.get().manage().window().maximize();

    }

第 2 步:将 Maven 插件添加到 pom.xml 以创建可执行 jar。

我们需要添加以下插件才能为我们的测试项目生成可执行 jar。

  • maven-编译器插件
  • maven 依赖插件
  • maven-jar-插件

查看下面的代码片段例如 -

<build>
  <finalName>dockerized</finalName>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-compiler-plugin</artifactId>
      <version>3.5.1</version>
      <configuration>
        <compilerVersion>1.8</compilerVersion>
        <source>1.8</source>
        <target>1.8</target>
      </configuration>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <executions>
        <execution>
          <id>copy-dependencies</id>
          <phase>prepare-package</phase>
          <goals>
            <goal>copy-dependencies</goal>
          </goals>
          <configuration>
            <outputDirectory>
              ${project.build.directory}/libs
            </outputDirectory>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>3.1.0</version>
      <executions>
        <execution>
          <goals>
            <goal>test-jar</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.18.1</version>
      <configuration>
        <suiteXmlFiles>
          <suiteXmlFile>testng.xml</suiteXmlFile>
        </suiteXmlFiles>
        <argLine>
          -javaagent:"${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar"
        </argLine>
      </configuration>
    </plugin>
  </plugins>
</build>

第 3 步:添加 healthcheck.sh 脚本

在运行测试之前,需要使用 healthcheck 脚本来检查网格可用性以接收测试请求。

echo "Checking if hub is ready - $HUB_HOST"

while [ "$( curl -s http://$HUB_HOST:4444/wd/hub/status | jq -r .value.ready )" != "true" ]
do
    sleep 1
done

第 4 步:添加 run.sh 脚本

java -cp dockerized.jar:dockerized-tests.jar:libs/* org.testng.TestNG testng.xml

第 5 步:创建 docker-compose.yml 文件

version: "3"
services:
  hub:
    image: selenium/hub:4.1.3
    ports:
      - "4442:4442"
      - "4443:4443"
      - "4444:4444"

  chrome:
    image: selenium/node-chrome:4.1.3
    shm_size: '3gb'
    depends_on:
      - hub
    links:
      - hub
    environment:
      - SE_EVENT_BUS_HOST=hub
      - SE_EVENT_BUS_PUBLISH_PORT=4442
      - SE_EVENT_BUS_SUBSCRIBE_PORT=4443
      - VNC_NO_PASSWORD=1

  test-run:
    build: .
    container_name: test-run
    depends_on:
      - chrome
    links:
      - hub
    environment:
      - MODULE=testng.xml
    volumes:
      - ./src/test/resources/results:/app

第 6 步:创建一个 Dockerfile 来指示创建 Docker 镜像

我们将在多阶段构建中使用多个基础镜像来创建最终镜像。第一阶段(名为package)将生成可执行jar,第二阶段(名为testrun)将运行这些可执行jar。

请注意根据需要在每个阶段使用的不同基础镜像。

FROM maven:3.6.1-jdk-8-alpine AS package

RUN apk add --update \
    curl \
    jq

RUN mkdir -p /app
WORKDIR /app

COPY pom.xml                          .
COPY healthcheck.sh                   .
RUN mvn -e -B dependency:resolve

COPY src                              ./src
RUN mvn verify --fail-never -DskipTests

WORKDIR /app/

ENTRYPOINT ["/bin/sh"]
CMD ["healthcheck.sh"]

FROM openjdk:8-jre-alpine AS testrun

RUN mkdir -p /jar
WORKDIR /jar/

COPY --from=package /app/target/dockerized.jar         .
COPY --from=package /app/target/dockerized-tests.jar   .
COPY --from=package /app/target/libs                        ./libs
COPY testng.xml                                             .
COPY run.sh                                                 .

WORKDIR /jar/

ENV HUB_HOST=hub
ENV MODULE=testng.xml

ENTRYPOINT ["/bin/sh"]
CMD ["run.sh"]

第 7 步:最后,运行 docker-compose

在项目根文件夹中打开 Powershell 并运行以下命令。

***docker-compose up --build***

示例项目链接 - https://gitlab.com/suryajit7/my-blog-topics

关于Docker Compose 不会启动 Selenium Grid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51830701/

相关文章:

docker - 如何执行在dockerfile中具有安装命令的Shell脚本

docker - 如何使用环境变量将主机名和/或 IP 地址发送到自己的容器中

postgresql - 如何使用卷从 docker 中的转储或 sql 文件恢复数据库?

linux - 在 Linux 上设置 Selenium 节点

java - RemoteWebDriver 抛出 "org.openqa.selenium.SessionNotCreatedException: Unable to create new remote session"

android - 使用 appium 和 selenium 网格运行自动化测试只能在一台设备上运行

配置文件的 docker secret

java - Docker-Compose 版本不受支持

node.js - 等待 node.js 直到 Logstash 准备好使用容器

Docker-compose 没有正确公开端口