docker 搭建 Selenium Grid
【参考】
github.com/SeleniumHQ/…
www.cnblogs.com/xyztank/art…
medium.com/geekculture…
一. selenium-grid
- 单机版
-
创建docker-compose.yml
vim docker-compose.yml编辑
# To execute this docker-compose yml file use `docker-compose -f docker-compose-v3-full-grid.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-full-grid.yml down`
version: "3"
services:
selenium-event-bus: # 这个不要改
image: selenium/event-bus
container_name: selenium-event-bus
ports:
- "4442:4442"
- "4443:4443"
- "5557:5557"
selenium-sessions: # 这个不要改
image: selenium/sessions
container_name: selenium-sessions
ports:
- "5556:5556"
depends_on:
- selenium-event-bus
environment:
- SE_EVENT_BUS_HOST=selenium-event-bus
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium-session-queue: # 这个不要改
image: selenium/session-queue
container_name: selenium-session-queue
ports:
- "5559:5559"
depends_on:
- selenium-event-bus
environment:
- SE_EVENT_BUS_HOST=selenium-event-bus
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
selenium-distributor: # 这个不要改
image: selenium/distributor
container_name: selenium-distributor
ports:
- "5553:5553"
depends_on:
- selenium-event-bus
- selenium-sessions
- selenium-session-queue
environment:
- SE_EVENT_BUS_HOST=selenium-event-bus
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_SESSIONS_MAP_HOST=selenium-sessions
- SE_SESSIONS_MAP_PORT=5556
- SE_SESSION_QUEUE_HOST=selenium-session-queue
- SE_SESSION_QUEUE_PORT=5559
selenium-router:
image: selenium/router
container_name: selenium-router
ports:
# 这个可以修改左边的4444,右边的4444不能改。左边的是4444宿主机Grid访问接口!
# 使用 ip:4444可以访问router网页,查看当前连接的node和session
# selenium自动化远程执行就是连接router,左边的端口就是入口,映射到右边的容器内端口
- "4444:4444"
depends_on:
- selenium-distributor
- selenium-sessions
- selenium-session-queue
environment:
- SE_DISTRIBUTOR_HOST=selenium-distributor
- SE_DISTRIBUTOR_PORT=5553
- SE_SESSIONS_MAP_HOST=selenium-sessions
- SE_SESSIONS_MAP_PORT=5556
- SE_SESSION_QUEUE_HOST=selenium-session-queue
- SE_SESSION_QUEUE_PORT=5559
chrome: # 这是 Node
image: selenium/node-chrome
volumes:
- /dev/shm:/dev/shm
depends_on:
- selenium-event-bus
environment:
- SE_EVENT_BUS_HOST=selenium-event-bus #不能改
- SE_EVENT_BUS_PUBLISH_PORT=4442 #不能改
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443 #不能改
- SE_NODE_MAX_SESSIONS=5 # 添加这个参数能让一个容器运行多个浏览器窗口(跑多个job)
- SE_NODE_OVERRIDE_MAX_SESSIONS=true # 如果添加了SE_NODE_MAX_SESSIONS,则这个参数必须添加
- SCREEN_HEIGHT=1080
- SCREEN_WIDTH=1920 # 容器浏览器分辨率
#- SE_VNC_NO_PASSWORD=1 #VNC不用输入密码即可访问
ports:
- "5901:5900" # 下载VNC Viewer软件,新建会话 ip:5901 ,能看到容器中运行的浏览器窗口,密码secret
- "7901:7900" # 浏览器中直接访问 ip:7901 , 能看到容器中运行的浏览器窗口,密码secret。如果noVNC连不上说明网络有防火墙。
chrome2:
image: selenium/node-chrome
volumes:
- /dev/shm:/dev/shm
depends_on:
- selenium-event-bus
environment:
- SE_EVENT_BUS_HOST=selenium-event-bus
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_MAX_SESSIONS=5
- SE_NODE_OVERRIDE_MAX_SESSIONS=true
- SCREEN_HEIGHT=1080
- SCREEN_WIDTH=1920
ports:
- "5904:5900"
- "7904:7900"
firefox:
image: selenium/node-firefox
volumes:
- /dev/shm:/dev/shm
depends_on:
- selenium-event-bus
environment:
- SE_EVENT_BUS_HOST=selenium-event-bus
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_NODE_MAX_SESSIONS=5
- SE_NODE_OVERRIDE_MAX_SESSIONS=true
- SCREEN_HEIGHT=1080
- SCREEN_WIDTH=1920
- SE_VNC_NO_PASSWORD=1
ports:
- "5902:5900"
- "7902:7900"
edge:
image: selenium/node-edge
volumes:
- /dev/shm:/dev/shm
depends_on:
- selenium-event-bus
environment:
- SE_EVENT_BUS_HOST=selenium-event-bus
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
- SE_VNC_NO_PASSWORD=1
ports:
- "5903:5900"
- "7903:7900"
-
启动docker-compose.yml
docker-compose -f docker-compose.yml up -d -
停止docker-compose
docker-compose -f docker-compose.yml down
- 多机器集群版
通过docker swarm实现
- 在master机器上初始化docker swarm,
docker swarm init - 执行后,记住下面的token
Swarm initialized: current node (gvkk2enrwtz5eb6wnmy96kn3e) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-440lc8co2d5h90mv6ztw2ii9866j3w2b71nq2mqm5oeddayd8i-aymg2ow9kty5pn6ue4o7ln7mr 10.219.21.4:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.
- 在worker机器上执行
docker swarm join --token SWMTKN-1-440lc8co2d5h90mv6ztw2ii9866j3w2b71nq2mqm5oeddayd8i-aymg2ow9kty5pn6ue4o7ln7mr 10.219.21.4:2377
- 通过
docker info命令在master机器上查看swarm信息
...
Swarm: active
...
Nodes: 2
说明配置正常
-
配置
docker-compose.yml编辑
# To start Docker in Swarm mode, you need to run `docker swarm init`
# To deploy the Grid, `docker stack deploy -c docker-compose-v3-swarm.yml grid`
# Stop with `docker stack rm grid`
# Stop swarm mode `docker swarm leave --force`
version: '3.7'
services:
chrome:
image: selenium/node-chrome
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
deploy:
replicas: 4
entrypoint: bash -c 'SE_OPTS="--host $$HOSTNAME" /opt/bin/entry_point.sh'
volumes:
- type: tmpfs
target: /dev/shm
tmpfs:
size: 2048000000 # (this means 2GB)
edge:
image: selenium/node-edge
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
deploy:
replicas: 1
entrypoint: bash -c 'SE_OPTS="--host $$HOSTNAME" /opt/bin/entry_point.sh'
volumes:
- type: tmpfs
target: /dev/shm
tmpfs:
size: 2048000000 # (this means 2GB)
firefox:
image: selenium/node-firefox
environment:
- SE_EVENT_BUS_HOST=selenium-hub
- SE_EVENT_BUS_PUBLISH_PORT=4442
- SE_EVENT_BUS_SUBSCRIBE_PORT=4443
deploy:
replicas: 1
entrypoint: bash -c 'SE_OPTS="--host $$HOSTNAME" /opt/bin/entry_point.sh'
volumes:
- type: tmpfs
target: /dev/shm
tmpfs:
size: 2048000000 # (this means 2GB)
selenium-hub:
image: selenium/hub
ports:
- "4442:4442"
- "4443:4443"
- "4444:4444"
deploy:
replicas: 1
placement:
constraints:
- node.role == worker
environment:
- GRID_BROWSER_TIMEOUT=60000
- GRID_TIMEOUT=60000
- GRID_MAX_SESSION=50
- GRID_MAXINSTANCES=3
- GRID_CLEAN_UP_CYCLE=60000
- GRID_UNREGISTER_IF_STILL_DOWN_AFTER=180000
- GRID_NEW_SESSION_WAIT_TIMEOUT=60000
-
启动
docker stack deploy --compose-file selenium-grid.yaml selenium-grid -
停止 docker stack ls docker stack rm selenium-grid
二. appium
appium安装(需要安装nodejs和npm)
npm install -g appium
android sdk安装
解压tar -x -f androiddk_r24.4.1-linux.tgz
移动下位置
mv android-sdk-linux/ /usr/local
配置环境变量vim ~/.bashrc
# android sdk
export ANDROID_SDK_HOME=/usr/localandroid-sdk-linux
export PATH=$PATH:${ANDROID_SDK_HOME}/tools
export PATH=$PATH:${ANDROID_SDK_HOME}/platform-tools
# java jdk
export JAVA_HOME=/opt/jdk1.8.0_271
export CLASSPATH=.:${JAVA_HOME}/lib:$CLASSPATH
export PATH=${JAVA_HOME}/bin:$PATH
然后 source ~/.bashrc
配置完成后通过appium-doctor检查一下appium的依赖是否都已经安装好了,没有的话缺什么补什么
appium-doctor 通过npm安装,npm install -g appium-doctor
如果提示路径里没有adb, 输入android,会弹出android sdk安装界面,根据提示安装build tools和platform 等。
执行appium-doctor还警告缺少一下依赖
WARN AppiumDoctor ✖ opencv4nodejs cannot be found.
WARN AppiumDoctor ✖ ffmpeg cannot be found
WARN AppiumDoctor ✖ mjpeg-consumer cannot be found.
WARN AppiumDoctor ✖ bundletool.jar cannot be found
(可选)安装依赖
opencv4nodejs
sudo apt update
sudo apt install libopencv-dev python3-opencv
# 验证
pkg-config --modversion opencv4
npm install -g opencv4nodejs
appium启动脚本
#!/bin/bash
echo "Starting appium..."
nohup appium --address 0.0.0.0 --port 4723 --session-override --log-timestamp --local-timezone --log appium.log >>/dev/null 2>&1 &
appium停止脚本
#!/bin/bash
echo 'Stoping appium...'
ps -ef |grep appium |grep -v grep |awk '{print $2}' |xargs kill -9
此时,就可以使用python/java等客户端连接appium了
appium grid设置
文档:appium.io/docs/cn/adv…