一、参考博客:
感谢蓝同学提供的资料
Docker——部署selenium grid进行分布式自动化测试_tellmewsm-CSDN博客
https://github.com/SeleniumHQ/docker-selenium
https://blog.csdn.net/lb245557472/article/details/91966770
二、什么是Selenium Grid:
Selenium Grid
是Selenium
套件的一部分,它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上。
Selenium Grid 主要使用 master-slaves (or hub-nodes) 理念 --一个 master/hub 和多个 基于master/hub注册的子节点 slaves/nodes。当我们在master上基于不同的浏览器/系统运行测试用例时,master将会分发给适当的node运行
什么时候用Selenium Grid
- 同时在不同的浏览器、操作系统和机器上运行测试。最大程度用于兼容性测试
- 减少运行时间
三、docker启动Selenium Grid
docker上已经有selenium官方的Selenium Grid镜像,只有你已经安装了docker,即可使用。
1、启动docker
2、docker下载主节点hub镜像和子节点各浏览器node镜像
运行命令将会下载内置镜像文件(包括java、Chrome、Firefox、selenium-server-standalone-XXX.jar 等运行selenium所需的环境)
docker pull selenium/hub
docker pull selenium/node-chrome-debug
docker pull selenium/node-firefox-debug
启动hub
docker run --name=hub -p 5001:4444 -e GRID_TIMEOUT=0 -e GRID_THROW_ON_CAPABILITY_NOT_PRESENT=true -e GRID_NEW_SESSION_WAIT_TIMEOUT=-1 -e GRID_BROWSER_TIMEOUT=15000 -e GRID_TIMEOUT=30000 -e GRID_CLEAN_UP_CYCLE=30000 -d selenium/hub:3.7.1-beryllium
查看当前运行的容器
docker ps
浏览器访问:
hub容器启动成功
三、启动 node 容器
docker run --name=chrome -p 5902:5900 -e NODE_MAX_INSTANCES=6 -e NODE_MAX_SESSION=6 -e NODE_REGISTER_CYCLE=5000 -e DBUS_SESSION_BUS_ADDRESS=/dev/null -v /dev/shm:/dev/shm --link hub -d selenium/node-chrome-debug:3.7.1-beryllium
由于 node 节点运行的是远程浏览器,selenium/node-chrome-debug 镜像,提供远程 debug 的功能,通过 VNC 远程桌面服务来进行查看浏览器的运行状态,所以 node 也需要映射一个端口来与 VNC 进行通信。VNC 密码是 secret。
NODE_MAX_INSTANCES、NODE_MAX_SESSION 这两个参数决定该 node 节点启动浏览器的上限,启动浏览器是非常消耗 CPU 的,如果启动过多,可能会压垮机器,需要设置上限进行保护。
-v /dev/shm:/dev/shm:这个参数是优化内存使用的,如果没有会因为内存问题容易崩溃。
--link hub:把 hub 的网络信息发送给 node 节点,将 hub 链接到容器上
访问:
点击 console,跳转如下:
通过该命令可以启动多个 node,注意更换下名称和端口号即可,刷新当前页面,会看到有多个节点。
node 也可以启动不同的浏览器,用来做浏览器的兼容性测试。
四、自动化演示
# demo.py
import selenium.webdriver.remote.webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities
from time import sleep
def test_baidu_search():
driver = selenium.webdriver.remote.webdriver.WebDriver(
command_executor="http://127.0.0.1:5001/wd/hub",
desired_capabilities=DesiredCapabilities.CHROME
)
driver.get("http://www.baidu.com")
driver.find_element_by_id("kw").send_keys("python")
driver.find_element_by_id("su").click()
sleep(2)
driver.quit()
运行代码打开百度,查看浏览器启动情况,可以看到单实例的node节点已经开启,浏览器图标置灰,容器端口为:0.0.0.0:4444->4444/tcp
通过 remote 将远程地址修改为 hub 的地址,由于是本地服务,所以只需要修改一下端口即可。
运行测试用例,发现执行通过,由于是运行在容器内,本地是看不到浏览器窗口的,还需要通过 VNC Viewer 来查看远程浏览器。
VNC Viewer
官网下载:Download VNC Viewer | VNC® Connect
打开应用后,command + N 新建远程链接,填写远程 IP 和端口,名称随意。
server 处输入 {本机IP}:5902,连接上面的 node-chrome-debug,密码为 secret;
链接成功后,执行测试用例,即可看到浏览器被拉起,搜索关键词 python 后点击搜索。