文章目录
1、如何使用 docker-compose 部署 selenium grid
产品文档 - SeleniumHQ / docker-selenium
https://github.com/SeleniumHQ/docker-selenium
产品文档 - Selenium Grid 4
https://www.selenium.dev/documentation/grid/
产品文档 - selenium
https://www.selenium.dev/documentation/
1.1 配置容器的常用参数
- –scale chrome=num
docker-compose up -d --scale chrome=num //num是要启动节点的数量,chrome是docker-compose文件中节点的名称
- VNC_NO_PASSWORD=1
没有密码验证的情况下运行 VNC
- VNC_VIEW_ONLY=1
仅查看模式下运行 VNC
- -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_MAX_SESSIONS=10
增加每个容器的会话并发性
- –shm-size=“2g”
来使用主机的共享内存,防止容器崩溃,这是避免浏览器在 docker 容器内崩溃的已知解决方法,这里是 Chrome和Firefox的记录问题。2gb 的 shm 大小是任意的,但已知效果很好,您的特定用例可能需要不同的值,建议根据您的需要调整此值。
- -v /home/ubuntu/files:/home/seluser/files
注意:mkdir /home/ubuntu/files
chown 1200:1201 /home/ubuntu/files
挂载数据卷前操作
- -e SE_OPTS= “–log-level FINE”
可以通过将环境变量传递给容器来增加日志输出
- docker logs -f <容器 ID | 容器名称>
所有输出都发送到标准输出,因此可以通过运行检查
- -e JAVA_OPTS=-Xmx512m
告诉节点事件总线在哪里,以便它可以注册自己。
- -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- -e SCREEN_WIDTH=1366
- -e SCREEN_HEIGHT=768
- -e SCREEN_DEPTH=24
- -e SCREEN_DPI=74
设置屏幕分辨率
- -e SE_NODE_SESSION_TIMEOUT
网格 URL 和会话超时,默认300秒
- -e E_SESSION_REQUEST_TIMEOUT=500
超时为 500 秒
- -e SE_SESSION_RETRY_INTERVAL=2
重试间隔为 2 秒
- -e SE_NODE_OVERRIDE_MAX_SESSIONS true
启用视频录制
- -e START_XVFB=false
以无头模式运行,默认是true
1.2 如何快速开始部署一个火狐浏览器容器?
- docker run -d -p 4444:4444 -p 7900:7900 --shm-size=2g selenium/standalone-firefox:4.1.2-20220131
- 查看部署的火狐浏览器:http://ip:4444
- 查看容器内发生的情况:http://ip:7900,密码:secret
1.3 如何访问容器内部?
1.3.1 第一种:通过 VNC 客户端访问
docker-selenium 项目使用的是 x11vnc 作为 VNC 服务器
VNC (Virtual Network Console) 是虚拟网络控制台的缩写。它 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的。
VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件,远程控制能力强大,高效实用,其性能可以和 Windows 和 MAC 中的任何远程控制软件媲美。x11vnc 允许人们使用任何VNC 查看器远程查看并与真实的X 显示器(即对应于物理监视器、键盘和鼠标的显示器)进行交互。通过这种方式,它扮演了 WinVNC 为 Windows 扮演的角色,适用于 Unix/X11
在 Linux 中,VNC 包括以下四个命令:vncserver,vncviewer,vncpasswd,和 vncconnect。
我们这里使用了其中的两个命令:vncserver【容器里面使用的是这个】 和 vncviewer【VNC客户端】。
- 下载VNC客户端:https://www.realvnc.com/de/connect/download/viewer/
- VNC 客户端访问容器内部,默认端口是: 5900
- 启动容器[启动一个后,再启动就会显示4444端口占用]:
谷歌:docker run -d -p 4444:4444 -p 5900:5900 --shm-size=2g selenium/standalone-chrome:4.1.2-20220131
火狐:docker run -d -p 4444:4444 -p 5902:5900 --shm-size=2g selenium/standalone-firefox:4.1.2-20220131
edge:docker run -d -p 4444:4444 -p 5901:5900 --shm-size=2g selenium/standalone-edge:4.1.2-20220131
- 输入 xxx.xxx.xxx.xxx : 5900 ,直接enter,输入密码:secret
1.3.2 第二种:通过 浏览器 访问容器
浏览器访问容器内部,原理是通过: noVNC
noVNC 既是 HTML VNC 客户端 JavaScript 库,又是构建在该库之上的应用程序,可以用来访问容器内部,默认端口是7900
noVNC 在任何现代浏览器中都能很好地运行,包括移动浏览器(iOS 和 Android)
- 启动所需浏览器的容器
docker run -d -p 4444:4444 -p 7900:7900 --shm-size=“2g” selenium/standalone-chrome:4.1.2-20220131
docker run -d -p 4444:4444 -p 7901:7900 --shm-size=“2g” selenium/standalone-edge:4.1.2-20220131
docker run -d -p 4444:4444 -p 7902:7900 --shm-size=“2g” selenium/standalone-firefox:4.1.2-20220131
- 浏览器查看容器内部
http://localhost:7900/ 连接到 Chrome 容器
http://localhost:7901/ 连接到 the Edge 容器
http://localhost:7902/ 连接到 the Firefox 容器
1.4 集线器(hub)和 节点(node)
1.4.1 node 跟 hub 在一台linux上
1、单独部署
1、创建docker网络:docker network create grid
2、创建hub集线器:docker run -d -p 4442-4444:4442-4444 --net grid --name selenium-hub selenium/hub:4.1.2-20220131
3、创建node节点1: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.1.2-20220131
4、创建node节点2: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.1.2-20220131
5、创建node节点3: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.1.2-20220131
6、使用完成后,删除容器:docker rm 容器id,删除网格:docker network rm grid
2、docker-compose 集成部署
- 创建 docker-compose-seleniumgrid.yml 文件
version: "3"
services:
chrome:
image: selenium/node-chrome:4.1.2-20220208
shm_size: 2gb
depends_on:
- selenium-hub
ports:
- "7901:7900"
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_SESSION_TIMEOUT=350
- SE_NODE_MAX_SESSIONS=10
edge:
image: selenium/node-edge:4.1.2-20220208
shm_size: 2gb
depends_on:
- selenium-hub
ports:
- "7902:7900"
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_SESSION_TIMEOUT=350
- SE_NODE_MAX_SESSIONS=5
firefox:
image: selenium/node-firefox:4.1.2-20220208
shm_size: 2gb
depends_on:
- selenium-hub
ports:
- "7903:7900"
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_SESSION_TIMEOUT=350
- SE_NODE_MAX_SESSIONS=8
selenium-hub:
image: selenium/hub:4.1.2-20220208
container_name: selenium-hub
ports:
- "4442:4442"
- "4443:4443"
- "4444:4444"
- 启动容器:docker-compose -f docker-compose-seleniumgrid.yml up -d
-f:指定yml文件
up:启动容器
-d:后台启动
- 使用谷歌浏览器运行脚本:pytest test_专家管理.py::ExpertManage::test_003 --server=ip --port=4444 --locale=zh_cn -n=3
[默认使用谷歌]
- 或者使用火狐浏览器:pytest test_专家管理.py::ExpertManage::test_003 --server=ip --port=4444 --locale=zh_cn -n=3 --browser=firefox
–server=ip --port=4444:部署 selenium grid 的ip
–locale=zh_cn:启动的浏览器默认是中文语言
-n = 3:分布式运行用例
- 停止容器:docker-compose -f docker-compose-v3.yml down
- 访问上面三个容器:
谷歌:http://ip:7901
edge:http://ip:7902
火狐:http://ip:7903
1.4.2 node 在其他linux上
- 虚拟机1启动hub集线器:
docker run -d -p 4442-4444:4442-4444 --name selenium-hub selenium/hub:4.1.2-20220131
- 虚拟机2启动node节点:
docker run -d -p 5555:5555 --shm-size=2g -e SE_EVENT_BUS_HOST=机器1IP -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST=机器2IP selenium/node-chrome:4.1.2-20220131
- 虚拟机3启动node节点:
docker run -d -p 5555:5555 --shm-size=2g -e SE_EVENT_BUS_HOST=机器1IP -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST =机器3IP selenium/node-edge:4.1.2-20220131
- 虚拟机4启动node节点:
docker run -d -p 5555:5555 --shm-size=2g -e SE_EVENT_BUS_HOST=机器1IP -e SE_EVENT_BUS_PUBLISH_PORT=4442 -e SE_EVENT_BUS_SUBSCRIBE_PORT=4443 -e SE_NODE_HOST =机器4IP selenium/node-firefox:4.1.2-20220131