我有以下 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***
关于Docker Compose 不会启动 Selenium Grid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51830701/