docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化

Selenium Grid作用就是分布式执行测试,讲分布式之前还是要说说UI自动化的优势来突出Selenium Grid,最简单的两点解决重复执行测试、解决多浏览器兼容这是UI自动化的价值;那分布式是什么概念?简单的说就是老大收到任务,分发给手下去干;通过Selenium Grid的可以控制多台机器多个浏览器执行测试用例,分布式上执行的环境在Selenium Grid中称为node节点。所谓的分布式结构就是由一个hub节点和若干个node代理节点组成。Hub用来管理各个代理节点的注册信息和状态信息,并且接受远程客户端代码的请求调用,然后把请求的命令转发给代理节点来执行。
原理:
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片


脚本客户端将指令通过remotedriver发送给gird hub,grid hub再将收到的请求按照一定策略分发给在hub上注册的各节点node,各node节点再启动对应的浏览器实现自动化执行。
1.下载镜像
github中搜索docker-selenium
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片



【docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化】docker-selenium将镜像分为hub和node两个镜像让我们使用,hub作为控制节点,分发任务给各个node节点;node-chrome-debug,我们可以通过vnc工具看出node的浏览器执行情况。
selenium/hub:3.7.1-beryllium
selenium/node-chrome-debug:3.7.1-beryllium
2.运行hub节点

docker run -d --name hub -p 5002: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容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片

公网访问hub主页
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片

3.部署node节点
docker run -d --name chrome -p 5003: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#-p 5003:5900将VNCserver的端口5900映射到宿主机的5003端口,我们就可以通过VNC-client访问5003端 口,查看node节点上自动化用例的执行情况了。 #-e 启动时配置环境变量,配置初始化的配置。 #NODE_MAX_INSTANCE 定义一个节点最多能启动的浏览器数量,此处是6个。 #--link 在演示模式下,单机同时部署hub和node时可通过--link实现hub与node节点的网络通信,--link原理 是将hub的网络信息注入node节点的环境变量中,这样就实现了两个容器之间的网络通信。VNC默认密码为secret

docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片

node节点部署好后,可访问hub主页中的console控制台,查看当前的节点数量及可用浏览器数量
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片

4.执行用例
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片

用例中Configuration.remote参数代表需要连接的远程hub机执行,所以,不会在脚本开发机上再启动浏览器执行用例,而是直接将请求发送到了远程hub机。
5.执行用例后可用VNC-viewer查看远程node节点的浏览器执行情况
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片

输入密码
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片

6.当用例数太多时可使用并发执行用例的配置;
python可利用前面讲到的pytest+x-dist实现:x-dist实现并发
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片

7.通过VNC viewer可查看到用例执行时在同一个node节点上启动了3个浏览器(同一个节点上浏览器启动数量有限制,因为启动浏览器比较消耗该node节点的本地资源)
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片

用例执行完毕后各node节点会将执行结果反馈给hub机,hub机收集好各节点的执行结果后再反馈给脚本客户端
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片

——————————————————————————————————————————
8.如何实现横向扩展后不同宿主机上的hub和node节点的通信?
只需要将hub机上的网络信息配置到node节点上的env中即可实现node与hub的通信
(jmeter分布式是将node执行机的网络信息配置到hub控制机配置文件中)
a.进入node节点宿主机的node节点容器env
docker exec -it node节点容器名 bash
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片

b.env|grep HUB
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片

c.在用docker run -d命令启动node节点时,通过 -e 参数配置环境变量,将hub机的网络信息注入到node节点的selenium grid容器中,实现横向扩展后的hub与node的通信。
docker容器|docker+selenium(基于selnenium grid) 实现分布式UI自动化
文章图片

    推荐阅读