该项目是由志愿者贡献者完成的,他们投入了数千小时的时间,并在 Apache License 2.0 下免费提供源代码。
这些 Docker 镜像带有一些标签来简化其使用,请在我们的一个版本中查看它们。
要获取新版本的通知,请将您自己添加为“仅发布”观察者。
这些镜像发布到 Selenium Docker Hub 的 Docker Hub 注册表中。
您需要帮助来使用这些 Docker 镜像吗?请通过 https://www.selenium.dev/support/ 与我们联系
--shm-size="2g"
docker run -d -p 4444:4444 -p 7900:7900 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
将您的 WebDriver 测试指向 http://localhost:4444
就是这样!
(可选)要查看容器内发生的情况,请访问 http://localhost:7900/?autoconnect=1&resize=scale&password=secret。
有关可视化容器活动的更多详细信息,请查看调试部分。
☝️ 当对包含浏览器的镜像执行docker run
时,请使用标志--shm-size=2g
来使用主机的共享内存。
☝️ 始终使用带有完整标签的 Docker 镜像来固定特定的浏览器和 Grid 版本。有关详细信息,请参阅标记约定。
从基于image tag的4.21.0
开始,该项目支持的架构如下:
建筑学 | 可用的 |
---|---|
x86_64(又名 amd64) | ✅ |
aarch64(又名arm64/armv8) | ✅ |
armhf(又名arm32/armv7l) | ❌ |
以下浏览器在多架构映像中可用:
建筑学 | 铬合金 | 铬 | 火狐浏览器 | 边缘 |
---|---|---|---|---|
x86_64(又名 amd64) | ✅ | ✅ | ✅ | ✅ |
aarch64(又名arm64/armv8) | ❌ | ✅ | ✅ | ❌ |
armhf(又名arm32/armv7l) | ❌ | ❌ | ❌ | ❌ |
笔记:
Google 不会为 Linux/ARM 平台构建 Chrome ( google-chrome
)。因此,Chrome(节点和独立)映像仅适用于 AMD64。同样,微软也没有为 Linux/ARM 平台构建 Edge ( microsoft-edge
)。
由于性能和稳定性问题,不建议在 ARM64 平台上模拟运行 AMD64 映像。
对于 Linux/ARM,请使用开源 Chromium 浏览器。 Chromium(节点和独立)映像可在多架构中使用。
$ docker run --rm -it -p 4444:4444 -p 5900:5900 -p 7900:7900 --shm-size 2g selenium/standalone-chromium:latest
多架构图像在 CircleCI 上使用资源类 Linux/ARM64 进行测试。请参阅下面的状态。
对于在 Apple M 系列或 Raspberry Pi 等平台上运行的实验性 docker 容器映像,seleniumhq-community/docker-seleniarm 的存储库提供了在 Seleniarm Docker Hub 注册表上发布的映像。
有关这些图像的更多信息,请参阅问题 #1076。
现在,分叉 seleniumhq-community/docker-seleniarm 已合并。
我们建议在 Docker Engine 中启用容器化镜像存储的实验功能。 containerd
理解多平台镜像,其中单个镜像标签可以引用涵盖一系列操作系统和硬件架构的不同变体。它简化了在不同平台上构建、存储和分发图像的过程。
在 Docker 引擎中启用该功能的单个命令:
make set_containerd_image_store
要构建多平台的所有映像,请运行以下命令:
PLATFORMS=linux/amd64,linux/arm64 make build
要构建特定平台的映像,请运行以下命令:
PLATFORMS=linux/arm64 make build
默认情况下,在不指定PLATFORMS
变量的情况下,映像是为linux/amd64
平台构建的。
Nightly 镜像构建在上游项目 Selenium 的 Nightly 构建之上,并包含此存储库中主分支的最新更改。图像标签是nightly
。不建议在生产中使用图像。它仅用于测试目的。
$ docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:nightly
查看 docker compose 以开始使用 Nightly 镜像 docker-compose-v3-full-grid-nightly.yml
为了运行测试或以其他方式使用预发布的浏览器,Google、Mozilla 和 Microsoft 为那些需要查看即将向普通大众发布的内容的人维护了一个开发和 Beta 发布渠道。
以下是在独立模式下运行它们的说明:
铬测试版:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-chrome:beta
Chrome 开发人员:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-chrome:dev
火狐测试版:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-firefox:beta
火狐开发者:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-firefox:dev
边缘测试版:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-edge:beta
边缘开发:
$ docker run --rm -it -p 4444:4444 -p 7900:7900 --shm-size 2g selenium/standalone-edge:dev
docker-compose-v3-beta-channel.yml:
# To execute this docker compose yml file use `docker compose -f docker-compose-v3-beta-channel.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker compose -f docker-compose-v3-beta-channel.yml down`
version: " 3 "
services:
chrome:
image: selenium/node-chrome:beta
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
edge:
image: selenium/node-edge:beta
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
firefox:
image: selenium/node-firefox:beta
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium-hub:
image: selenium/hub:latest
container_name: selenium-hub
ports:
- " 4442:4442 "
- " 4443:4443 "
- " 4444:4444 "
docker-compose-v3-dev-channel.yml:
# To execute this docker compose yml file use `docker compose -f docker-compose-v3-dev-channel.yml up`
# Add the `-d` flag at the end for detached execution
# To stop the execution, hit Ctrl+C, and then `docker compose -f docker-compose-v3-dev-channel.yml down`
version: " 3 "
services:
chrome:
image: selenium/node-chrome:dev
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
edge:
image: selenium/node-edge:dev
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
firefox:
image: selenium/node-firefox:dev
shm_size: 2gb
depends_on:
- selenium-hub
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium-hub:
image: selenium/hub:latest
container_name: selenium-hub
ports:
- " 4442:4442 "
- " 4443:4443 "
- " 4444:4444 "
有关 Dev 和 Beta 通道容器映像的更多信息,请参阅有关通过 Docker Selenium 开发和 Beta 通道浏览器的博客文章。
火狐浏览器
docker run -d -p 4444:4444 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
铬合金
docker run -d -p 4444:4444 --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
边缘
docker run -d -p 4444:4444 --shm-size= " 2g " selenium/standalone-edge:4.26.0-20241101
注意: 4444
端口只能同时运行一个Standalone容器。
有不同的方法来运行图像并创建具有集线器和节点的网格,请检查以下选项。
集线器和节点将在同一网络中创建,它们将通过容器名称相互识别。第一步需要创建 Docker 网络。
$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-chrome:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-edge:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-firefox:4.26.0-20241101
$ docker network create grid
$ docker run - d - p 4442 - 4444 : 4442 - 4444 -- net grid -- name selenium - hub selenium / hub: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
-- shm - size = " 2g " `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
selenium / node - chrome: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
-- shm - size = " 2g " `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
selenium / node - edge: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
-- shm - size = " 2g " `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
selenium / node - firefox: 4.26 . 0 - 20241101
当您使用完网格并且容器已退出时,可以使用以下命令删除网络:
# Removes the grid network
$ docker network rm grid
集线器和节点将创建在不同的机器/虚拟机上,它们需要知道彼此的 IP 才能正确通信。如果多个节点将在同一台机器/VM 上运行,则必须将它们配置为公开不同的端口。
$ docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d -p 5555:5555 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 2> selenium/node-chrome:4.26.0-20241101
$ docker run - d - p 5555 : 5555 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 2> ` selenium / node - chrome: 4.26 . 0 - 20241101
$ docker run -d -p 5555:5555 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 3> selenium/node-edge:4.26.0-20241101
$ docker run - d - p 5555 : 5555 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 3> ` selenium / node - edge: 4.26 . 0 - 20241101
$ docker run -d -p 5555:5555 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 4> selenium/node-firefox:4.26.0-20241101
$ docker run - d - p 5555 : 5555 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 4> ` selenium / node - firefox: 4.26 . 0 - 20241101
$ docker run -d -p 5556:5556 --shm-size= " 2g " -e SE_EVENT_BUS_HOST= < ip-from-machine- 1> -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST= < ip-from-machine- 4> -e SE_NODE_PORT=5556 selenium/node-chrome:4.26.0-20241101
$ docker run - d - p 5556 : 5556 ` -- shm - size = " 2g " ` - e SE_EVENT_BUS_HOST = < ip - from - machine - 1> ` - e SE_EVENT_BUS_PUBLISH_PORT = 4442 ` - e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 ` - e SE_NODE_HOST = < ip - from - machine - 4> ` - e SE_NODE_PORT = 5556 ` selenium / node - chrome: 4.26 . 0 - 20241101
Docker Compose 是启动网格的最简单方法。使用下面的链接资源,将它们保存在本地并检查每个文件顶部的执行指令。
docker-compose-v2.yml
docker-compose-v3.yml
要停止网格并清理创建的容器,请运行docker compose down
。
docker-compose-v3-swarm.yml
可以启动一个 Selenium 网格,并将其所有组件分开。为了简单起见,仅提供 docker compose 的示例。将文件保存到本地,然后查看上面的执行指令。
docker-compose-v3-full-grid.yml
环境变量 | 选项 | 类型 | 默认值 | 描述 |
---|---|---|---|---|
SE_REJECT_UNSUPPORTED_CAPS | --reject-unsupported-caps | 布尔值 | false | 如果网格不支持所请求的功能,则允许分发者立即拒绝请求。 |
SE_HEALTHCHECK_INTERVAL | --healthcheck-interval | 整数 | 120 | 这确保服务器在一段时间后可以成功 ping 所有节点。 |
可以使用selenium/video:ffmpeg-7.1-20241101
Docker 镜像来记录测试执行情况。每个运行浏览器的容器都需要一个容器。这意味着如果您运行 5 个节点/独立容器,则将需要 5 个视频容器,映射为 1-1。
目前,执行此映射的唯一方法是手动(手动启动容器或通过docker compose
)。我们正在迭代这个过程,将来这个设置可能会更加简单。
我们提供的视频Docker镜像是基于jrottenberg/ffmpeg项目提供的ffmpeg Ubuntu镜像,感谢您提供这个镜像并简化了我们的工作?
从基于镜像标签的4.20.0
开始,视频 Docker 镜像基于 linuxserver/docker-ffmpeg 项目提供的 FFmpeg Ubuntu 镜像,因为该镜像可用于多平台。感谢您简化我们的项目并帮助我们在多种架构支持方面取得进展。
注意事项:
/videos
目录中。映射本地目录以获取视频。FILE_NAME
环境变量覆盖视频文件名,以避免出现意外结果。此示例显示如何手动启动容器:
$ docker network create grid
$ docker run -d -p 4444:4444 -p 6900:5900 --net grid --name selenium --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
$ docker run -d --net grid --name video -v /tmp/videos:/videos selenium/video:ffmpeg-7.1-20241101
# Run your tests
$ docker stop video && docker rm video
$ docker stop selenium && docker rm selenium
容器停止并删除后,您应该在计算机的/tmp/videos
目录中看到一个视频文件。
这是使用集线器和一些节点的示例:
docker-compose-v3-video.yml
基于元数据在测试中的支持。当录像机与浏览器节点一起部署并启用SE_VIDEO_FILE_NAME=auto
并将元数据添加到测试中时,视频文件名将提取功能se:name
的值并将其用作视频文件名。
例如在 Python 绑定中:
from selenium . webdriver . chrome . options import Options as ChromeOptions
from selenium import webdriver
options = ChromeOptions ()
options . set_capability ( 'se:name' , 'test_visit_basic_auth_secured_page (ChromeTests)' )
driver = webdriver . Remote ( options = options , command_executor = "http://localhost:4444" )
driver . get ( "https://selenium.dev" )
driver . quit ()
输出视频文件名将为test_visit_basic_auth_secured_page_ChromeTests_
。
如果您的测试名称由测试框架处理,并且它是唯一的,您还可以通过设置SE_VIDEO_FILE_NAME_SUFFIX=false
来禁用会话 ID 附加到视频文件名。
文件名将被修剪为 255 个字符以避免长文件名。此外, space
字符将被_
替换,并且文件名中仅保留字母、数字、 -
(连字符)、 _
(下划线)字符。
可以通过设置SE_VIDEO_FILE_NAME_TRIM_REGEX
环境变量来自定义修剪正则表达式。默认值为[:alnum:]-_
。正则表达式应与 bash 中的tr
命令兼容。
在部署级别,记录器容器始终处于运行状态。此外,您可以通过会话功能se:recordVideo
禁用视频录制过程。例如在 Python 绑定中:
options . set_capability ( 'se:recordVideo' , False )
在录像机容器中,会根据Node SessionId在Hub中执行查询GraphQL,并提取capability中se:recordVideo
的值,然后决定是否启动视频录制过程。
注意:要到达 GraphQL 端点,记录器容器需要知道 Hub URL。 Hub URL 可以通过环境变量SE_NODE_GRID_URL
传递。例如SE_NODE_GRID_URL
是http://selenium-hub:4444
。
RCLONE 安装在录像机映像中。您可以使用它将视频上传到云存储服务。除了上面提到的视频录制之外,您还可以通过设置以下环境变量来启用上传功能:
version : " 3 "
services :
chrome_video :
image : selenium/video:ffmpeg-7.1-20241101
depends_on :
- chrome
environment :
- DISPLAY_CONTAINER_NAME=chrome
- SE_VIDEO_FILE_NAME=auto
- SE_VIDEO_UPLOAD_ENABLED=true
- SE_UPLOAD_DESTINATION_PREFIX=s3://mybucket/path
- RCLONE_CONFIG_S3_TYPE=s3
- RCLONE_CONFIG_S3_PROVIDER=GCS
- RCLONE_CONFIG_S3_ENV_AUTH=true
- RCLONE_CONFIG_S3_REGION=asia-southeast1
- RCLONE_CONFIG_S3_LOCATION_CONSTRAINT=asia-southeast1
- RCLONE_CONFIG_S3_ACL=private
- RCLONE_CONFIG_S3_ACCESS_KEY_ID=xxx
- RCLONE_CONFIG_S3_SECRET_ACCESS_KEY=xxx
- RCLONE_CONFIG_S3_ENDPOINT=https://storage.googleapis.com
- RCLONE_CONFIG_S3_NO_CHECK_BUCKET=true
SE_VIDEO_FILE_NAME=auto
将使用会话 ID 作为视频文件名。这可确保上传的视频文件名是唯一的。视频文件名构造根据节点端点/status
(和可选的 GraphQL 端点)自动工作,以获取会话 ID、功能。
SE_VIDEO_UPLOAD_ENABLED=true
将启用视频上传功能。在后台,它将创建一个包含文件和目标的管道文件,供上传者使用和继续。
SE_VIDEO_INTERNAL_UPLOAD=true
将使用容器中安装的 RCLONE 进行上传。如果您想使用其他 sidecar 容器进行上传,请将其设置为false
。
每个模式的 ENV 变量 | 集线器/节点 | 独立角色 | 动态网格 |
---|---|---|---|
SE_VIDEO_RECORD_STANDALONE (强制) | false (默认) | true | true |
DISPLAY_CONTAINER_NAME (必填) | 用户输入 | 用户输入 | (非必需) |
SE_NODE_PORT (可选) | 5555 | 4444 | (非必需) |
SE_NODE_GRID_URL (可选) | 用户输入 | (非必需) | (非必需) |
对于带有前缀RCLONE_
环境变量,用于将远程配置传递给 RCLONE。您可以在此处找到有关 RCLONE 配置的更多信息。在动态网格中使用时,这些变量应与前缀SE_
组合,例如SE_RCLONE_
。请参阅下面的参考资料了解更多详细信息。
配置Hub和Node的视频录制和上传:docker-compose-v3-video-upload.yml
为独立角色配置视频录制和上传:docker-compose-v3-video-upload-standalone.yml
配置动态网格(node-docker)的视频录制和上传:docker-compose-v3-video-upload-dynamic-grid.yml
配置 Dynamic Grid 独立版 (standalone-docker) 的视频录制和上传:tests/docker-compose-v3-test-standalone-docker.yaml
环境变量 | 默认值 | 描述 |
---|---|---|
SE_UPLOAD_RETAIN_LOCAL_FILE | false | 上传成功后保留本地文件 |
SE_UPLOAD_COMMAND | copy | RCLONE命令用于传输文件。当保留本地文件为false 时强制move |
SE_UPLOAD_OPTS | -P --cutoff-mode SOFT --metadata --inplace | 可以设置属于 RCLONE 命令的其他选项。 |
SE_UPLOAD_CONFIG_FILE_NAME | upload.conf | 远程主机的配置文件,而不是通过环境变量前缀 SE_RCLONE_* 设置 |
SE_UPLOAD_CONFIG_DIRECTORY | /opt/bin | 配置文件目录(挂载其他目录下的conf文件时更改) |
Grid 4 能够按需启动 Docker 容器,这意味着它会在后台为每个新会话请求启动一个 Docker 容器,在那里执行测试,当测试完成时,容器将被丢弃。
此执行模式可以在独立角色或节点角色中使用。 “动态”执行模式需要被告知容器启动时要使用哪些 Docker 镜像。此外,Grid 需要知道 Docker 守护进程的 URI。该配置可以放置在本地toml
文件中。
您可以将此文件保存在本地并命名,例如config.toml
。
[ docker ] # Configs have a mapping between the Docker image to use and the capabilities that need to be matched to # start a container with the given image. configs = [ " selenium/standalone-firefox:4.26.0-20241101 " , ' {"browserName": "firefox"} ' , " selenium/standalone-chrome:4.26.0-20241101 " , ' {"browserName": "chrome"} ' , " selenium/standalone-edge:4.26.0-20241101 " , ' {"browserName": "MicrosoftEdge"} ' ] host-config-keys = [ " Dns " , " DnsOptions " , " DnsSearch " , " ExtraHosts " , " Binds " ] # URL for connecting to the docker daemon # Most simple approach, leave it as http://127.0.0.1:2375, and mount /var/run/docker.sock. # 127.0.0.1 is used because internally the container uses socat when /var/run/docker.sock is mounted # If var/run/docker.sock is not mounted: # Windows: make sure Docker Desktop exposes the daemon via tcp, and use http://host.docker.internal:2375. # macOS: install socat and run the following command, socat -4 TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock, # then use http://host.docker.internal:2375. # Linux: varies from machine to machine, please mount /var/run/docker.sock. If this does not work, please create an issue. url = " http://127.0.0.1:2375 " # Docker image used for video recording video-image = " selenium/video:ffmpeg-7.1-20241101 " # Uncomment the following section if you are running the node on a separate VM # Fill out the placeholders with appropriate values # [server] # host =# port =
使用 config.toml 文件中 [docker] 部分下的可选配置密钥host-config-keys
(或 CLI 选项 --docker-host-config-keys)。用户可以指定应传递给浏览器容器的 docker 主机配置密钥列表。
Docker 主机配置的有效键名称可以在 Docker API 文档中找到,也可以通过命令docker inspect
node-docker 容器找到。
如果您想通过动态网格容器的卷配置访问节点浏览器容器中的下载目录(例如/home/seluser/Downloads
),您可以将以下配置添加到config.toml
文件
[ docker ]
host-config-keys = [ " Binds " ]
docker compose 文件中的卷配置
services :
node-docker :
image : selenium/node-docker:latest
volumes :
- ./assets:/opt/selenium/assets
- ./config.toml:/opt/selenium/docker.toml
- ./downloads:/home/seluser/Downloads
- /var/run/docker.sock:/var/run/docker.sock
environment :
- SE_NODE_DOCKER_CONFIG_FILENAME=docker.toml
/opt/selenium/config.toml
是所有镜像中配置文件的默认路径。一旦卷配置共享到节点浏览器容器,其config.toml
可能会被节点 docker 容器配置文件覆盖。
在这种情况下,将config.toml
文件挂载到 node-docker 容器中的/opt/selenium/docker.toml
中。并设置环境变量SE_NODE_DOCKER_CONFIG_FILENAME=docker.toml
来指定启动脚本的配置文件名。
请参阅示例 docker-compose-v3-test-node-docker.yaml
这可以扩展到完整的网格部署,所有组件都单独部署。总体思路是将集线器放在一个虚拟机中,将每个节点放在单独的、更强大的虚拟机中。
$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/node-docker:4.26.0-20241101
$ docker network create grid
$ docker run - d - p 4442 - 4444 : 4442 - 4444 -- net grid -- name selenium - hub selenium / hub: 4.26 . 0 - 20241101
$ docker run - d -- net grid - e SE_EVENT_BUS_HOST = selenium - hub `
- e SE_EVENT_BUS_PUBLISH_PORT = 4442 `
- e SE_EVENT_BUS_SUBSCRIBE_PORT = 4443 `
- v ${PWD} / config.toml: / opt / selenium / config.toml `
- v ${PWD} / assets: / opt / selenium / assets `
- v / var / run / docker.sock: / var / run / docker.sock `
selenium / node - docker: 4.26 . 0 - 20241101
要将资产保存在您的主机上,请将您的主机路径安装到/opt/selenium/assets
。
当您使用完网格并且容器已退出时,可以使用以下命令删除网络:
# Removes the grid network
$ docker network rm grid
docker run --rm --name selenium-docker -p 4444:4444
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/standalone-docker:4.26.0-20241101
docker run --rm --name selenium-docker -p 4444:4444 `
-v ${PWD} /config.toml:/opt/selenium/config.toml `
-v ${PWD} /assets:/opt/selenium/assets `
-v /var/run/docker.sock:/var/run/docker.sock `
selenium/standalone-docker:4.26.0-20241101
$ docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:4.26.0-20241101
$ docker run -d -p 5555:5555
-e SE_EVENT_BUS_HOST= < ip-from-machine- 1>
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/node-docker:4.26.0-20241101
$ docker run -d -p 5555:5555 `
-e SE_EVENT_BUS_HOST= < ip-from-machine- 1> `
-e SE_EVENT_BUS_PUBLISH_PORT=4442 `
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 `
-v ${PWD} /config.toml:/opt/selenium/config.toml `
-v ${PWD} /assets:/opt/selenium/assets `
-v /var/run/docker.sock:/var/run/docker.sock `
selenium/node-docker:4.26.0-20241101
完成config.toml
文件中的[server]
部分。
[ docker ] # Configs have a mapping between the Docker image to use and the capabilities that need to be matched to # start a container with the given image. configs = [ " selenium/standalone-firefox:4.26.0-20241101 " , " { " browserName " : " firefox " } " , " selenium/standalone-chrome:4.26.0-20241101 " , " { " browserName " : " chrome " } " , " selenium/standalone-edge:4.26.0-20241101 " , " { " browserName " : " MicrosoftEdge " } " ] # URL for connecting to the docker daemon # Most simple approach, leave it as http://127.0.0.1:2375, and mount /var/run/docker.sock. # 127.0.0.1 is used because interally the container uses socat when /var/run/docker.sock is mounted # If var/run/docker.sock is not mounted: # Windows: make sure Docker Desktop exposes the daemon via tcp, and use http://host.docker.internal:2375. # macOS: install socat and run the following command, socat -4 TCP-LISTEN:2375,fork UNIX-CONNECT:/var/run/docker.sock, # then use http://host.docker.internal:2375. # Linux: varies from machine to machine, please mount /var/run/docker.sock. If this does not work, please create an issue. url = " http://127.0.0.1:2375 " # Docker image used for video recording video-image = " selenium/video:ffmpeg-7.1-20241101 " # Uncomment the following section if you are running the node on a separate VM # Fill out the placeholders with appropriate values [ server ] host = < ip-from-node-machine> port = < port-from-node-machine>
要将资产保存在您的主机上,请将您的主机路径安装到/opt/selenium/assets
。
这是使用集线器和节点的示例:
docker-compose-v3-dynamic-grid.yml
容器可以通过环境变量进一步配置,例如SE_NODE_SESSION_TIMEOUT
和SE_OPTS
。当创建子容器时,所有以SE_
为前缀的环境变量都将被转发并设置在容器中。您可以在standalone-docker
或node-docker
容器中设置所需的环境变量。以下示例将所有会话的会话超时设置为 700 秒:
docker run --rm --name selenium-docker -p 4444:4444
-e SE_NODE_SESSION_TIMEOUT=700
-v ${PWD} /config.toml:/opt/selenium/config.toml
-v ${PWD} /assets:/opt/selenium/assets
-v /var/run/docker.sock:/var/run/docker.sock
selenium/standalone-docker:4.26.0-20241101
docker run --rm --name selenium-docker -p 4444:4444 `
-e SE_NODE_SESSION_TIMEOUT=700 `
-v ${PWD} /config.toml:/opt/selenium/config.toml `
-v ${PWD} /assets:/opt/selenium/assets `
-v /var/run/docker.sock:/var/run/docker.sock `
selenium/standalone-docker:4.26.0-20241101
要记录您的 WebDriver 会话,您需要添加一个设置为true
se:recordVideo
字段。您还可以设置时区和屏幕分辨率,例如:
{
"browserName" : " firefox " ,
"platformName" : " linux " ,
"se:recordVideo" : " true " ,
"se:timeZone" : " US/Pacific " ,
"se:screenResolution" : " 1920x1080 "
}
运行测试后,检查安装到 Docker 容器的路径 ( ${PWD}/assets
),您应该会看到视频和会话信息。
从语言绑定中,您可以设置se:name
功能来动态更改输出视频文件名。例如,在 Python 绑定中:
from selenium . webdriver . chrome . options import Options as ChromeOptions
from selenium import webdriver
options = ChromeOptions ()
options . set_capability ( 'se:recordVideo' , True )
options . set_capability ( 'se:screenResolution' , '1920x1080' )
options . set_capability ( 'se:name' , 'test_visit_basic_auth_secured_page (ChromeTests)' )
driver = webdriver . Remote ( options = options , command_executor = "http://localhost:4444" )
driver . get ( "https://selenium.dev" )
driver . quit ()
测试执行后,在( ${PWD}/assets
)下,您可以在路径/
中看到视频文件名
文件名将被修剪为 255 个字符,以避免长文件名。此外, space
字符将被_
替换,并且文件名中仅保留字母、数字、 -
(连字符)和_
(下划线)字符。 (此 PR 合并后即可使用此功能)
tzdata
安装在基础镜像中,您可以使用环境变量TZ
设置容器中的时区。默认情况下,时区设置为UTC
。可以在此处找到支持的时区列表。例如:
$ docker run --rm --entrypoint= " " -e TZ=Asia/Ho_Chi_Minh selenium/node-chromium:latest date +%FT%T%Z
2024-08-28T18:19:26+07
我们提供了一个 Helm 图表来将这些 Docker 镜像部署到 Kubernetes。请参阅 Helm 自述文件了解更多详细信息。
您可以传递SE_OPTS
变量和附加命令行参数来启动集线器或节点。
$ docker run -d -p 4444:4444 -e SE_OPTS= " --log-level FINE " --name selenium-hub selenium/hub:4.26.0-20241101
您可以将SE_JAVA_OPTS
环境变量传递给 Java 进程。
$ docker run -d -p 4444:4444 -e SE_JAVA_OPTS=-Xmx512m --name selenium-hub selenium/hub:4.26.0-20241101
不要通过语言绑定中的浏览器选项添加参数,例如:
options = ChromeOptions ()
options . add_argument ( '--incognito' )
options . add_argument ( '--disable-dev-shm-usage' )
driver = webdriver . Remote ( options = options , command_executor = "http://localhost:4444/wd/hub" )
您还可以主动强制直接从(节点、独立或节点 Docker)容器环境变量应用参数。定义环境变量,其名称以SE_BROWSER_ARGS_
开头,后面的配置键由您决定(确保在定义多个参数时这些变量是唯一的)。例如:
docker run -d -p 4444:4444
-e SE_BROWSER_ARGS_INCOGNITO=--incognito
-e SE_BROWSER_ARGS_DISABLE_DSHM=--disable-dev-shm-usage
selenium/standalone-chrome:latest
列出 chromium 命令行参数供您参考。
注意:目前,这适用于节点浏览器 Chrome/Chromium、Edge。
节点通过事件总线注册自己。当网格以其典型的集线器/节点设置启动时,集线器将充当事件总线,而当网格以其所有五个元素分开启动时,事件总线将独立运行。
在这两种情况下,都需要告诉节点事件总线在哪里,以便它可以注册自己。这就是SE_EVENT_BUS_HOST
、 SE_EVENT_BUS_PUBLISH_PORT
和SE_EVENT_BUS_SUBSCRIBE_PORT
环境变量的用途。
在某些情况下,例如,如果您想标记节点,则可能需要向节点配置提供自定义构造型。环境变量SE_NODE_STEREOTYPE
设置节点的config.toml
中的构造型条目。可以在此处找到示例 config.toml 文件:设置匹配特定节点的自定义功能。
以下是这些环境变量的默认值的示例:
$ docker run -d
-e SE_EVENT_BUS_HOST= < event_bus_ip | event_bus_name >
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_STEREOTYPE= " { " browserName " : " ${SE_NODE_BROWSER_NAME} " , " browserVersion " : " ${SE_NODE_BROWSER_VERSION} " , " platformName " : " Linux " } "
--shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
将命令中继到支持 WebDriver 的服务端点。将支持 WebDriver 的外部服务连接到 Selenium Grid 非常有用。此类服务的一个示例可以是云提供商或 Appium 服务器。通过这种方式,Grid 可以更多地覆盖本地不存在的平台和版本。
以下是配置中继命令的示例。
docker-compose-v3-test-node-relay.yml
如果您只想中继命令, selenium/node-base
适合此用途且轻量级。如果您想使用浏览器和中继命令配置节点,则可以使用相应的节点图像。
要使用环境变量生成中继配置,请设置SE_NODE_RELAY_URL
和其他变量,如下所示
[ relay ]
url = " ${SE_NODE_RELAY_URL} "
status-endpoint = " ${SE_NODE_RELAY_STATUS_ENDPOINT} "
protocol-version = " ${SE_NODE_RELAY_PROTOCOL_VERSION} "
configs = [ ' ${SE_NODE_RELAY_MAX_SESSIONS} ' , ' {"browserName": "${SE_NODE_RELAY_BROWSER_NAME}", "platformName": "${SE_NODE_RELAY_PLATFORM_NAME}", "appium:platformVersion": "${SE_NODE_RELAY_PLATFORM_VERSION}"} ' ]
要使用中继节点运行示例测试,您可以克隆该项目并尝试以下命令:
make test_node_relay
默认情况下,可以通过http://127.0.0.1:4444/
访问 Selenium。可以通过指定SE_SUB_PATH
环境变量将 Selenium 配置为使用自定义子路径。在下面的示例中,可以通过http://127.0.0.1:4444/selenium-grid/
访问 Selenium
$ docker run -d -p 4444:4444 -e SE_SUB_PATH=/selenium-grid/ --name selenium-hub selenium/hub:4.26.0-20241101
默认情况下,节点以 1920 x 1080 的屏幕分辨率开始,颜色深度为 24 位,dpi 为 96。可以通过在启动容器时指定SE_SCREEN_WIDTH
、 SE_SCREEN_HEIGHT
、 SE_SCREEN_DEPTH
和/或SE_SCREEN_DPI
环境变量来调整这些设置。
docker run -d -e SE_SCREEN_WIDTH=1366 -e SE_SCREEN_HEIGHT=768 -e SE_SCREEN_DEPTH=24 -e SE_SCREEN_DPI=74 selenium/standalone-firefox:4.26.0-20241101
在某些用例中,您可能需要将网格 URL 设置为节点,例如,如果您想访问 BiDi/CDP 端点。当您想要使用 Selenium 4 中存在的新RemoteWebDriver.builder()
或Augmenter()
时,这也是需要的(因为它们隐式设置 BiDi/CDP 连接)。您可以通过SE_NODE_GRID_URL
环境变量来完成此操作,例如-e SE_NODE_GRID_URL=http://
。如果您想在会话执行时查看实时视图,则需要设置此环境变量。
Grid 的默认会话超时为 300 秒,其中会话可以处于陈旧状态,直到被终止。您可以使用SE_NODE_SESSION_TIMEOUT
以秒为单位覆盖该值。
新的会话请求在处理之前会被放入会话队列中,并且该请求会一直保留在队列中,直到在注册的节点中找到匹配的槽。但是,如果未找到插槽,新会话请求可能会超时。默认情况下,请求在达到超时之前将在队列中保留最多 300 秒。此外,每 5 秒尝试处理一次请求(默认情况下)。
可以通过 Hub 和 SessionQueue 中的环境变量( SE_SESSION_REQUEST_TIMEOUT
和SE_SESSION_RETRY_INTERVAL
)覆盖这些值。例如,500 秒的超时将为SE_SESSION_REQUEST_TIMEOUT=500
,2 秒的重试间隔将为SE_SESSION_RETRY_INTERVAL=2
。
默认情况下,通过SE_NODE_MAX_SESSIONS
环境变量将每个容器仅配置一个会话运行。可以将该数量增加到最大可用处理器数,这是因为当一个容器/浏览器有 1 个 CPU 运行时,可以实现更高的稳定性。
但是,如果您测量了性能并基于此,您认为每个容器中可以执行更多会话,则可以通过将SE_NODE_MAX_SESSIONS
设置为所需的数字并将SE_NODE_OVERRIDE_MAX_SESSIONS
设置为true
来覆盖最大限制。不过,不建议运行比可用处理器更多的浏览器会话,因为这会导致资源超载。
当启用视频录制时,覆盖此设置会产生不良副作用,因为同一视频中可能会捕获多个浏览器会话。
Firefox、Chrome,使用无头模式时,无需启动 Xvfb 服务器。
为了避免启动服务器,您可以将SE_START_XVFB
环境变量设置为false
(或除true
之外的任何其他值),例如:
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub -e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_START_XVFB=false --shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
有关更多信息,请参阅此 GitHub 问题。
著名的:
SE_START_XVFB
需要设置为true
才能在--headless=new
模式下运行。在某些环境中,例如 Docker Swarm 或 Kubernetes,在执行 N 个测试后关闭 Node 或 Standalone 容器很有用。例如,这可以在 Kubernetes 中用于终止 pod,然后在 N 个会话后扩展一个新的 pod。将环境变量SE_DRAIN_AFTER_SESSION_COUNT
设置为大于零的值以启用此行为。
$ docker run -e SE_DRAIN_AFTER_SESSION_COUNT=5 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
使用前面的命令,独立容器将在执行 5 个会话后关闭。
在长时间运行的容器中,浏览器可能会留下一些残留物。这些可能是已完成但未能完全停止浏览器的作业的浏览器进程被卡住,或写入/tmp
文件系统的临时文件(尤其是在基于 Chrome 的浏览器上)。为了避免这些资源填满容器中的进程 ID 和文件系统使用情况,节点容器中每小时都会运行一个自动清理脚本。这将清理旧进程和旧临时文件。默认情况下,此功能处于禁用状态。启用后,这将清理运行时间超过 2 小时的浏览器以及超过 1 天的文件。可以使用以下环境变量启用和调整这些:
SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP
:默认值false
,设置为true
以启用清理。SE_BROWSER_LEFTOVERS_INTERVAL_SECS
:默认值3600
(1 小时),清理间隔以秒为单位。SE_BROWSER_LEFTOVERS_PROCESSES_SECS
:默认值7200
(2小时),运行时间超过此时间的浏览器将被杀死。SE_BROWSER_LEFTOVERS_TEMPFILES_DAYS
:默认值1
(1 天),基于 Chrome 的浏览器在/tmp
中生成的文件将在这些天数后被删除(使用 Firefox 时将被忽略)。如果您使用 Selenium 进行长时间运行的会话,并且预计浏览器运行时间超过 2 小时,请不要将SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP
设置为true
(保留默认值false
),或者调整SE_BROWSER_LEFTOVERS_PROCESSES_SECS
以设置高于预期长时间的值。运行浏览器进程。
$ docker run -e SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP=true --shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
使用前面的命令,将按照默认时间启用清理。
$ docker run -e SE_ENABLE_BROWSER_LEFTOVERS_CLEANUP=true
-e SE_BROWSER_LEFTOVERS_INTERVAL_SECS=7200
-e SE_BROWSER_LEFTOVERS_PROCESSES_SECS=3600
-e SE_BROWSER_LEFTOVERS_TEMPFILES_DAYS=2
--shm-size= " 2g " selenium/node-chrome:4.26.0-20241101
使用前面的命令,清理将启用,但将每 2 小时运行一次(而不是 1 小时),将终止运行时间超过 1 小时(而不是 2 小时)的浏览器,并将删除超过 2 天的临时文件(而不是1)。
控制台日志中很少有输出变量(例如密码、秘密等)被隐藏。出于调试目的,您可以通过将SE_MASK_SECRETS
设置为false
来禁用它
创建 bash 脚本时,您可以使用语法echo "Current value is $(mask ${YOUR_VARIABLE})
屏蔽输出
SE_MASK_SECRETS_MIN_LENGTH
默认为3
。这意味着长字符串将被屏蔽为***
以避免暴露长度以进行暴力攻击。
默认情况下,位置/opt/selenium/secrets
中的映像中包含默认的自签名证书
server.jks
:启动服务器时通过系统属性javax.net.ssl.trustStore
为 JVM 配置的信任库文件。server.pass
:文件通过系统属性javax.net.ssl.trustStorePassword
包含 JVM 的信任库密码。tls.crt
:https 连接的服务器证书设置为 Selenium 选项--https-certificate
。tls.key
:https 连接的服务器私钥(PKCS8 格式)设置为 Selenium 选项--https-private-key
。有环境变量来配置安全连接:
环境变量 | 默认 | 选项 | 描述 |
---|---|---|---|
SE_ENABLE_TLS | false | 使用默认配置启用安全连接 | |
SE_JAVA_SSL_TRUST_STORE | /opt/selenium/secrets/server.jks | 虚拟机 | |
SE_JAVA_SSL_TRUST_STORE_PASSWORD | /opt/selenium/secrets/server.pass | 虚拟机 | |
SE_JAVA_DISABLE_HOSTNAME_VERIFICATION | true | 虚拟机 | 禁用主机内部组件检查 |
SE_HTTPS_证书 | /opt/selenium/secrets/tls.crt | 硒 | 设置为 CLI 选项--https-certificate |
SE_HTTPS_PRIVATE_KEY | /opt/selenium/secrets/tls.key | 硒 | 设置为 CLI 选项--https-private-key |
通过卷挂载,您可以将默认证书替换为您自己的证书。
自签名证书还需要受到客户端的信任(添加到系统广泛捆绑受信任的 CA),以避免在创建 RemoteWebDriver 时出现与 SSL 握手相关的错误消息。
请参阅示例: docker-compose-v3-full-grid-secure.yml
不同的浏览器有不同的方式来设置绑定的语言和区域设置。
通过绑定创建 WebDriver 时设置配置文件首选项,可以将 Firefox 配置为使用特定语言和区域设置。此外,需要安装语言包作为附加组件,浏览器 UI 语言才能生效。例如,要将浏览器语言和区域设置设置为vi-VN
,您可以使用以下步骤:
获取所需语言的最新 Firefox 语言包,例如 https://download.mozilla.org/?product=firefox-langpack-latest-SSL&lang=vi。然后,您可以在创建 RemoteWebDriver 实例时将语言包作为附加组件安装。
profile = webdriver . FirefoxProfile ()
profile . set_preference ( 'intl.accept_languages' , 'vi-VN,vi' )
profile . set_preference ( 'intl.locale.requested' , 'vi-VN,vi' )
options = FirefoxOptions ()
options . profile = profile
driver = webdriver . Remote ( options = options , command_executor = "http://selenium-hub:4444/wd/hub" )
webdriver . Firefox . install_addon ( driver , "/local/path/to/vi.xpi" )
driver . get ( 'https://google.com' )
有一个脚本可以获取给定 Firefox 版本的所有可用语言包。您可以运行该脚本以将语言包获取到您的源。例如:
FIREFOX_VERSION= $( docker run --rm --entrypoint= " " selenium/node-firefox:latest firefox --version | awk ' {print $3} ' )
&& ./NodeFirefox/get_lang_package.sh ${FIREFOX_VERSION} /local/path/to/download
或者,您可以将容器目录/home/seluser/firefox/distribution/extensions
挂载到主机目录,以访问容器中预先构建的包,以便在测试脚本中使用。
Supervisor用于管理容器中的进程和日志。 supervisord
的一些配置可以通过环境变量设置,如下所示:
环境变量 | 默认 | supervisord 配置 |
---|---|---|
SE_SUPERVISORD_LOG_LEVEL | info | Supervisord.loglevel |
SE_SUPERVISORD_CHILD_LOG_DIR | /tmp | Supervisord.childlogdir |
SE_SUPERVISORD_LOG_FILE | /tmp/supervisord.log | 主管日志文件 |
SE_SUPERVISORD_PID_FILE | /tmp/supervisord.pid | Supervisord.pid文件 |
克隆存储库,并从项目目录根目录中运行以下命令来构建所有内容:
$ VERSION=local make build
如果您需要配置环境变量来构建映像(例如 http 代理),只需设置一个环境变量BUILD_ARGS
,其中包含要传递到 docker 上下文的其他变量(这只适用于 docker >= 1.9)
$ BUILD_ARGS= " --build-arg http_proxy=http://acme:3128 --build-arg https_proxy=http://acme:3128 " make build
注意:省略VERSION=local
将使用已发布版本构建映像,但替换当前版本的日期。
如果你想使用主机 UID/GID 构建镜像,只需设置一个环境变量BUILD_ARGS
$ BUILD_ARGS= " --build-arg UID= $( id -u ) --build-arg GID= $( id -g ) " make build
如果您想使用不同的默认用户/密码构建映像,只需设置环境变量BUILD_ARGS
$ BUILD_ARGS= " --build-arg SEL_USER=yourseluser --build-arg SEL_PASSWD=welcome " make build
基于最新的 Dockerfile(通过克隆存储库并从项目目录根目录),您可以使用 Selenium Grid 和浏览器版本的特定组合来构建映像。
例如,您希望分别使用基于 Grid 的版本4.17.0
和 Chrome 浏览器版本119
、 120
、 123
构建node-chrome
和standalone-chrome
图像。
$ ./tests/build-backward-compatible/bootstrap.sh 4.17.0 119,120,123 chrome
一般来说,该脚本采用以下参数:
$1
(强制):Selenium Grid 版本。详细信息从矩阵文件中获取$2
(必填):浏览器主要版本,多个值以逗号分隔。详细信息从矩阵文件中获取$3
(可选):浏览器名称。如果未提供,它将在所有浏览器( chrome
, edge
, firefox
)上迭代$4
(可选):将图像推向注册表。默认情况下,它是false
。如果要将图像推到注册表,请将其设置为true
(需要在运行脚本之前完成的Docker登录到您的名称空间)。要为图像设置命名空间,您可以在运行脚本之前设置环境变量NAME
。例如:
$ export NAME=artifactory.yourcompany.com/selenium
$ ./tests/build-backward-compatible/bootstrap.sh 4.17.0 119,120,123 chrome
运行脚本后,您将看到带有完整标签的列表图像,以固定特定网格和浏览器版本,标记约定
硒服务器,浏览器和驱动程序已在图像中预安装。如果您想保留在同一硒版上,然后将浏览器及其驱动程序升级到最新版本。您可以按照以下步骤操作
克隆仓库,从项目目录root您可以通过运行升级:
$ VERSION= $EXPECTED_SELENIUM_VERSION make chrome_upgrade_version
例如: VERSION=4.16.1 make chrome_upgrade_version
新图像具有tag $VERSION_YYYYMMDD
,其中YYYYMMDD
是当前日期。
$ VERSION= $SELENIUM_VERSION make firefox_upgrade_version
$ VERSION= $SELENIUM_VERSION make edge_upgrade_version
您可以在makefile文件中参考详细命令。
最好首先检查网格是否已启动并准备接收请求,这是一个可以通过检查/wd/hub/status
端点来完成的。
准备好的网格,由轮毂和两个节点组成,看起来像这样:
{
"value" : {
"ready" : true ,
"message" : " Selenium Grid ready. " ,
"nodes" : [
{
"id" : " 6c0a2c59-7e99-469d-bbfc-313dc638797c " ,
"uri" : " http: u002fu002f 172.19.0.3:5555 " ,
"maxSessions" : 4 ,
"stereotypes" : [
{
"capabilities" : {
"browserName" : " firefox "
},
"count" : 4
}
],
"sessions" : [
]
},
{
"id" : " 26af3363-a0d8-4bd6-a854-2c7497ed64a4 " ,
"uri" : " http: u002fu002f 172.19.0.4:5555 " ,
"maxSessions" : 4 ,
"stereotypes" : [
{
"capabilities" : {
"browserName" : " chrome "
},
"count" : 4
}
],
"sessions" : [
]
}
]
}
}
"ready": true
值表示网格准备接收请求。在进行任何测试之前,可以通过脚本对此状态进行轮询,也可以在启动Docker容器时将其作为健康检查。
图像中包含的脚本检查网格。SH可用于轮询网格状态。
该示例检查一次网格的状态每15秒钟,完成检查后的超时时间为30秒,并且最多可重试5次,直到容器被标记为不健康。请使用调整后的值适合您的需求,(如果需要)替换环境中使用的值的--host
和--port
参数。
$ docker network create grid
$ docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub
--health-cmd= ' /opt/bin/check-grid.sh --host 0.0.0.0 --port 4444 '
--health-interval=15s --health-timeout=30s --health-retries=5
selenium/hub:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-chrome:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-edge:4.26.0-20241101
$ docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-firefox:4.26.0-20241101
注意: Line定界符无法在基于Windows的终端上使用,请尝试
^
或Backtick。
可以通过执行docker ps
并验证(healthy)|(unhealthy)
状态或通过以下方式进行检查来检查容器健康状况:
$ docker inspect --format= ' {{json .State.Health.Status}} ' selenium-hub
" healthy "
Docker中已知的一个常见问题是,运行的容器并不总是意味着其中的应用程序已经准备就绪。解决此问题的一种简单方法是使用“ Wait-it-It”脚本,可以在此处看到更多信息。
以下脚本是如何使用Bash完成此操作的示例,但是如果您想使用用于编写测试的编程语言执行此操作,则适用相同的原则。在下面的示例中,脚本将每秒轮询状态端点。如果网格在30秒内未准备就绪,则脚本将使用错误代码退出。
#! /bin/bash
# wait-for-grid.sh
set -e
url= " http://localhost:4444/wd/hub/status "
wait_interval_in_seconds=1
max_wait_time_in_seconds=30
end_time= $(( SECONDS + max_wait_time_in_seconds ))
time_left= $max_wait_time_in_seconds
while [ $SECONDS -lt $end_time ] ; do
response= $( curl -sL " $url " | jq -r ' .value.ready ' )
if [ -n " $response " ] && [ " $response " ] ; then
echo " Selenium Grid is up - executing tests "
break
else
echo " Waiting for the Grid. Sleeping for $wait_interval_in_seconds second(s). $time_left seconds left until timeout. "
sleep $wait_interval_in_seconds
time_left= $(( time_left - wait_interval_in_seconds ))
fi
done
if [ $SECONDS -ge $end_time ] ; then
echo " Timeout: The Grid was not started within $max_wait_time_in_seconds seconds. "
exit 1
fi
将需要通过
apt-get
安装jq
,否则脚本将不完成执行而不断打印Waiting
。
注意:如果需要,请替换环境中正确值的localhost
和4444
。另外,此脚本是无限期的,您可能需要调整它并建立超时。
假设执行测试的普通命令是mvn clean test
。这是一种使用上述脚本并执行测试的方法:
$ ./wait-for-grid.sh && mvn clean test
像这样,脚本将进行轮询,直到准备就绪为止,然后您的测试将开始。
默认情况下,基于的映像是安装了libnss3-tools
,并初始化/home/seluser/.pki/nssdb
,因此您可以无rootless添加证书。如果您需要安装自定义证书,CA,中级CA或客户端证书(例如企业内部CA),则可以从Selenium Node Image创建自己的Docker映像。基于铬的浏览器将nssdb
用作证书存储。然后,您可以像这样在Dockerfile中安装所有必需的内部证书:
图像中有一个包装的实用程序脚本,可用于将您的证书添加到nssdb
商店和捆绑包中。该脚本是/opt/bin/add-cert-helper.sh
。
创建一个使用Selenium节点图像作为基础的Dockerfile,并将脚本复制到容器中,然后执行。例如,Dockerfile
如果您必须创建一组不同的证书和节点图像。您可以创建一个引导脚本以一击进行操作。例如,Bootstrap.sh
可以使用以下命令对上述示例进行测试:
make test_custom_ca_cert
# ./tests/customCACert/bootstrap.sh
您可以在这里找到更多信息
这样,将安装证书,节点将像以前一样自动启动。
作为替代方案,您可以将证书文件添加到现有的Selenium图像中。这个实用的示例假设您有一个已知的图像可以用作构建图像,并且可以向本地Docker注册表发布新图像。
此示例使用基于红色的发行版作为构建图像(岩石Linux),但它可以是您选择的任何Linux图像。请注意,构建指令在分布之间会有所不同。您可以在上一个示例中检查Ubuntu的说明。
该示例还假设您的内部CA已经在/etc/pki/ca-trust/source/source/anchors/your_ca.pem中,这是Rocky Linux的默认位置。另外,您还可以从主机提供这些文件并将其复制到构建图像中。
对于Chrome和Edge浏览器,配方是相同的,只需调整图像名称(节点 - 奇异或节点edge):
# Get a standard image for creating nssdb file
FROM rockylinux:8.6 as build
RUN yum install -y nss-tools
RUN mkdir -p -m755 /seluser/.pki/nssdb
&& certutil -d sql:/seluser/.pki/nssdb -N --empty-password
&& certutil -d sql:/seluser/.pki/nssdb -A -t "C,," -n YOUR_CA -i /etc/pki/ca-trust/source/anchors/YOUR_CA.pem
&& chown -R 1200:1201 /seluser
# Start from Selenium image and add relevant files from build image
FROM selenium/node-chrome:4.26.0-20241101
USER root
COPY --from=build /seluser/ /home/seluser/
USER seluser
Firefox的示例:
# Get a standard image for working on
FROM rockylinux:8.6 as build
RUN mkdir -p "/distribution" "/certs" &&
cp /etc/pki/ca-trust/source/anchors/YOUR_CA*.pem /certs/ &&
echo '{ "policies": { "Certificates": { "Install": ["/opt/firefox-latest/YOUR_CA.pem"] }} }' >"/distribution/policies.json"
# Start from Selenium image and add relevant files from build image
FROM selenium/node-firefox:4.26.0-20241101
USER root
COPY --from=build /certs /opt/firefox-latest
COPY --from=build /distribution /opt/firefox-latest/distribution
USER seluser
该项目使用X11VNC作为VNC服务器,允许用户检查容器内部发生的情况。用户可以通过两种方式连接到该服务器:
VNC服务器正在收听端口5900,您可以使用VNC客户端并连接到它。可以随意将端口5900映射到您想要的任何免费外部端口。
内部5900端口保持不变,因为这是在容器内运行的VNC服务器的配置端口。如果要使用--net=host
则可以使用SE_VNC_PORT
环境变量覆盖它。
这是一个独立图像的示例,同样的概念适用于节点图像。
$ docker run -d -p 4444:4444 -p 5900:5900 --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
$ docker run -d -p 4445:4444 -p 5901:5900 --shm-size= " 2g " selenium/standalone-edge:4.26.0-20241101
$ docker run -d -p 4446:4444 -p 5902:5900 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
然后,您将在VNC客户端中使用:
如果您得到提示,请询问密码,那是: secret
。如果您想更改此信息,则可以设置环境变量SE_VNC_PASSWORD
。
如果您想在没有密码身份验证的情况下运行VNC,则可以设置环境变量SE_VNC_NO_PASSWORD=1
。
如果要以仅视图模式运行VNC,则可以设置环境变量SE_VNC_VIEW_ONLY=1
。
如果要修改VNC服务器进程的打开文件描述符限制,则可以设置环境变量SE_VNC_ULIMIT=4096
。
该项目使用NovNC允许用户使用浏览器检查视觉容器活动。如果您不能在计算机上安装VNC客户端,则可能会派上用场。端口7900用于启动NOVNC,因此您需要使用浏览器连接到该端口。
与上一节类似,可以随意将端口7900映射到您想要的任何免费外部端口。您还可以使用SE_NO_VNC_PORT
环境变量覆盖它,以防您要使用--net=host
。
这是一个独立图像的示例,同样的概念适用于节点图像。
$ docker run -d -p 4444:4444 -p 7900:7900 --shm-size= " 2g " selenium/standalone-chrome:4.26.0-20241101
$ docker run -d -p 4445:4444 -p 7901:7900 --shm-size= " 2g " selenium/standalone-edge:4.26.0-20241101
$ docker run -d -p 4446:4444 -p 7902:7900 --shm-size= " 2g " selenium/standalone-firefox:4.26.0-20241101
然后,您将在浏览器中使用:
如果您得到提示,请询问密码,那是: secret
。
如果您在资源上运行较低,或者根本不需要检查运行会议,则可能根本不运行VNC。只需在网格启动上设置SE_START_VNC=false
环境变量即可。
为了启用在Selenium Grid容器中进行跟踪,可以执行以下命令:
docker network create grid
docker run -d -p 16686:16686 -p 4317:4317 --net grid --name jaeger jaegertracing/all-in-one:1.54
docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.26.0-20241101
docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_ENABLE_TRACING=true
-e SE_OTEL_TRACES_EXPORTER=otlp
-e SE_OTEL_EXPORTER_ENDPOINT=http://jaeger:4317
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-chrome:4.26.0-20241101
docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_ENABLE_TRACING=true
-e SE_OTEL_TRACES_EXPORTER=otlp
-e SE_OTEL_EXPORTER_ENDPOINT=http://jaeger:4317
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-edge:4.26.0-20241101
docker run -d --net grid -e SE_EVENT_BUS_HOST=selenium-hub
--shm-size= " 2g "
-e SE_ENABLE_TRACING=true
-e SE_OTEL_TRACES_EXPORTER=otlp
-e SE_OTEL_EXPORTER_ENDPOINT=http://jaeger:4317
-e SE_EVENT_BUS_PUBLISH_PORT=4442
-e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium/node-firefox:4.26.0-20241101
您还可以参考以下Docker组成的YAML文件,以便能够启动简单的网格(或)动态网格。
您可以查看Jaeger UI并跟踪您的请求。
默认情况下,网格组件中启用了跟踪。没有跟踪导出器端点,它将查找本地实例,例如localhost/[0:0:0:0:0:0:0:1]:4117
。在容器日志中,您可以看到以下几行:
ERROR (ThrottlingLogger.dolog) Failed to export spans.
The request could not be executed. Error message: Failed to connect to localhost/[0:0:0:0:0:0:0:1]:4117
java.net.ConnectException: Failed to connect to localhost/[0:0:0:0:0:0:0:1]:4317
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:297)
at okhttp3.internal.connection. ExchangeFinder.findConnection (Exchangefinder.kt: 226)
at okhttp3.internal.connection.okhttps.internal.connection.RealConnection.connect(RealConnection.kt:207)
在这种情况下,只需设置SE_ENABLE_TRACING=false
即可禁用跟踪(每个组件导出了自己的痕迹)。
所有输出都将发送到Stdout,因此可以通过运行来检查:
$ docker logs -f < container-id | container-name >
您可以通过将环境变量传递给容器来增加日志输出:
SE_OPTS="--log-level FINE"
--shm-size="2g"
为什么需要--shm-size 2g
?
这是避免浏览器坠毁在Docker容器内的已知解决方法,这是Chrome和Firefox的记录问题。 2GB的SHM大小是任意的,但已知效果很好,您的特定用例可能需要不同的值,建议根据您的需求调整此值。
如果您看到以下硒例外:
Message: invalid argument: can't kill an exited process
或者
Message: unknown error: Chrome failed to start: exited abnormally
或者
[DriverServiceSessionFactory.apply] - Error while creating session with the driver service. Stopping driver service: java.util.concurrent.TimeoutException
原因可能是您已将SE_START_XVFB
环境变量设置为false
,但忘记在无头模式下实际运行Firefox,Chrome或Edge。
一个常见的方案是将卷安装到浏览器容器上,以检索下载的文件。这在Windows和MacOS中效果很好,但在Linux中没有解决方法。有关更多详细信息,请检查这个有据可查的问题。
例如,在使用Linux时,您可能会以以下方式启动容器:
docker run -d -p 4444:4444 --shm-size= " 2g "
-v /home/ubuntu/files:/home/seluser/Downloads
selenium/standalone-chrome:4.26.0-20241101
这将将主机/home/ubuntu/files
目录安装到容器内的/home/seluser/Downloads
(默认浏览器的下载目录)内。问题之所以发生,是因为音量将被安装为root
。因此,浏览器无法将文件写入该目录,因为它在用户seluser
下运行。发生这种情况是因为Docker在Linux中安装量,这是本期中的更多详细信息。
这样做的解决方法是在安装音量之前在主机上创建一个目录并更改其权限。根据用户权限,您可能需要将sudo
用于其中一些命令:
mkdir /home/ubuntu/files
chown 1200:1201 /home/ubuntu/files
执行此操作后,您应该能够将文件下载到已安装的目录。如果您有更好的解决方法,请给我们发送拉动请求!
类似于安装卷以检索下载的文件。对于视频文件,您可能需要执行相同的操作
mkdir /tmp/videos
chown 1200:1201 /tmp/videos