用docker搭建selenium grid分布式环境实践之路
最近需要测试zoom视频会议,同时模拟100个人加入会议。经过了解,zoom提供了直接通过url链接加入会议的方式(只能通过chrome浏览器或者FireFox浏览器,因为用的协议是webrtc)。
顺着这个思路考虑可以通过Selenium自动化,同时启动多个浏览器进程,每个进程代表一个视频会议用户,达到模拟多方会议的效果。不过有以下两个难点:
- 需要多个chrome浏览器进程同时存活,在电脑上启动一个chrome浏览器进程差不多要消耗220M左右。
- 视频会议的音频和视频源的问题。
针对视频会议的音频和视频源的问题,chrome浏览器有比较好的支持,在Selenium脚本中初始化Chrome浏览器的参数中,只需要加入如下配置:
chrome_options.add_argument("--use-fake-ui-for-media-stream")
chrome_options.add_argument("--use-fake-device-for-media-stream")
就能在加入视频会议之后,使用虚拟的视频和音频。不过有个问题需要考虑,这个虚拟视频和真实的视频会议中的视频质量看上去是有差距的,会不会对测试结果造成影响,我们这里暂时不讨论这个话题。
现在唯一比较头疼的是怎么实现100个chrome浏览器进程,可能你会觉得,这不就是资源问题吗?加服务器不就搞定了?!但是假如有了服务器资源之后,怎么做任务调度呢?好在有Selenium Grid,它是Selenium的三大组件,专门用来执行分布式测试。
于是基于Selenium Grid设计了个测试方案:
- 将某台服务器作为Hub,也就是master
- 将剩下的机器作为node,注册到hub机器。
- 本地采用多进程执行Selenium自动化脚本(我使用python语言实现的)。
按照上面的设计思路,理论上是能够模拟出100人同时加入会议的。接下来我们就正式开始用docker搭建Selenium Grid分布式环境的探索之路。
selenium jar包直接启动节点
其实,最开始我是直接使用jar包启动节点的,起几个节点还能接受,但是节点多了之后会特别麻烦,比如:想重启下节点,则需要手动全部kill掉,然后再一个个启动。
只要是手动重复的工作,就能脚本化。于是我写了两个shell脚本,一个脚本是根据传参启动对应数量的节点;另一个脚本是将所有的节点进程全部kill掉。主要脚本如下图所示:

虽然用脚本也能轻松的执行,但还是不方便。首先启动节点后,会增加好多java进程,并且没办法查看单个节点的日志,因为所有节点的日志都同时在控制台打印。于是考虑用docker来管理Selenium grid节点。
用docker命令直接启动
在github上有现成的镜像: https://github.com/SeleniumHQ/docker-selenium 。然后说明文档中也列出了所有可用的镜像名称,因为我主要使用chrome浏览器,所有安装了: selenium/hub 、 selenium/node-chrome、 selenium/node-chrome-debug 三个镜像,其中selenium/node-chrome-debug镜像会启动一个VNC Server,在脚本执行过程中,本地可以连上VNC Server,通过界面查看服务器的脚本执行情况。 使用命令:
$ docker pull selenium/hub
$ docker pull selenium/node-chrome
$ docker pull selenium/node-chrome-debug
启动hub的命令如下:
$ docker run -d -p 4444:4444 -e GRID_MAX_SESSION=100 --name hub selenium/hub
启动本地节点(hub和node在一台机器上)的命令如下:
$ docker run -d -p 5555:5555 -e NODE_MAX_INSTANCES=5 -e NODE_MAX_SESSION=5 --shm-size=2g --link hub:hub --name node1 selenium/node-chrome
启动远端节点(hub和node不在一台机器上)的命令如下:
$ docker run -d -p port:5555 -e HUB_HOST=remote_ip -e HUB_PORT=remote_port -e REMOTE_HOST=http://ip:port -e NODE_MAX_INSTANCES=5 -e NODE_MAX_SESSION=5 --shm-size=2g --name node1 selenium/node-chrome
这里需要注意,网上很多教程提供的启动命令都是hub和node在一台机器上,假如需要hub和node在不同的机器上,按照网上的教程,虽然启动不会报错,但是节点和hub之间的网络是不通的。
不过直接使用docker命令虽然可以单独查看单个节点的日志,但是却和使用jar包的方式面对一样的问题:启动多个节点,非常不方便,需要手动执行多次命令。有没有更好的方案呢?当然有,可以使用docker-compose对docker容器进行整合。
docker-compose 启动
docker compose是docker的一个命令行工具,用来定义和运行多个容器组成的应用。相当于我们可以将多个docker命令放到一个文件里,然后由docker-compose一键执行。
同样的,也需要分两种情况:
Hub和node在一台机器上
可以使用如下的配置文件docker-compose.yml
version: "3"
services:
selenium-hub:
image: selenium/hub
container_name: selenium-hub
ports:
- "4444:4444"
environment:
- GRID_MAX_SESSION=50
- GRID_TIMEOUT=900
- START_XVFB=false
chrome:
image: selenium/node-chrome
volumes:
- /dev/shm:/dev/shm
depends_on:
- selenium-hub
environment:
- HUB_HOST=selenium-hub
- HUB_PORT=4444
- NODE_MAX_INSTANCES=5
- NODE_MAX_SESSION=5
然后在控制台执行命令:
$ docker-compose up -d //-d表示在后台运行
如果想同时启动多个节点该怎么办呢?非常简单:
$ docker-compose up -d --scale chrome=num //num是要启动节点的数量
如果想关闭节点,可以执行如下命令:
$ docker-compose down
Hub和node不在一台机器上
可以使用如下配置文件docker-compose.yml
version: "3"
services:
# selenium-chrome-1
selenium-chrome-node-1:
image: selenium/node-chrome
volumes:
- /dev/shm:/dev/shm
ports:
- "5556:5555"
restart: always
stdin_open: true
environment:
HUB_HOST: hub_ip
HUB_PORT: 4444
NODE_MAX_INSTANCES: 5
NODE_MAX_SESSION: 5
REMOTE_HOST: http://节点ip:5556
GRID_TIMEOUT: 60000
shm_size: "2gb"
# selenium-chrome-2
selenium-chrome-node-2:
image: selenium/node-chrome
volumes:
- /dev/shm:/dev/shm
ports:
- "5555:5555"
restart: always
stdin_open: true
container_name: node1
environment:
HUB_HOST: hub_ip
HUB_PORT: 4444
NODE_MAX_INSTANCES: 5
NODE_MAX_SESSION: 5
REMOTE_HOST: http://节点ip:5555
GRID_TIMEOUT: 60000
shm_size: "2gb"
# selenium-chrome-3
selenium-chrome-node-3:
image: selenium/node-chrome
volumes:
- /dev/shm:/dev/shm
ports:
- "5557:5555"
restart: always
stdin_open: true
environment:
HUB_HOST: hub_ip
HUB_PORT: 4444
NODE_MAX_INSTANCES: 5
NODE_MAX_SESSION: 5
REMOTE_HOST: http://节点ip:5557
GRID_TIMEOUT: 60000
shm_size: "2gb"
# selenium-chrome-4
selenium-chrome-node-4:
image: selenium/node-chrome
volumes:
- /dev/shm:/dev/shm
ports:
- "5558:5555"
restart: always
stdin_open: true
environment:
HUB_HOST: hub_ip
HUB_PORT: 4444
NODE_MAX_INSTANCES: 5
NODE_MAX_SESSION: 5
REMOTE_HOST: http://节点ip:5558
GRID_TIMEOUT: 60000
shm_size: "2gb"
# selenium-chrome-5
selenium-chrome-node-5:
image: selenium/node-chrome
volumes:
- /dev/shm:/dev/shm
ports:
- "5559:5555"
restart: always
stdin_open: true
environment:
HUB_HOST: hub_ip
HUB_PORT: 4444
NODE_MAX_INSTANCES: 5
NODE_MAX_SESSION: 5
REMOTE_HOST: http://节点ip:5559
GRID_TIMEOUT: 60000
shm_size: "2gb"
启动节点的命令是(前提是hub需要提前启动):
$ docker-compose up -d
关闭节点的命令是:
$ docker-compose down
遗留问题
按照我上面这种方式搭建Selenium Grid环境,本地节点可以正常执行,但是远端的节点却经常超时,不过从http://hub_ip:4444/grid/console界面上看到的节点网络全部都是通的。
之前查过一些资料,貌似需要使用Docker Swarm,它是一个docker集群管理工具, 将若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源 。不过目前还没研究它,后面如果用Docker Swarm有结论之后,我再写文章同步给大家。
总结
用docker搭建selenium grid分布式环境,非常方便,基本是一行命令就能启动或者关闭节点。希望我这篇文章能给大家提供一些思路,帮助大家在平时的工作中解决一些问题。
还是那句话,任何技术,只要能帮你解决实际的问题,就是好的技术!
用docker搭建selenium grid分布式环境实践之路的更多相关文章
- 使用docker搭建selenium grid 分布式环境
本文章只做docker搭建selenium grid 分布式环境步骤说明,对于selenium grid中的参数.流程.原理等不做说明.selenium grid的详细情况可查看官方文档https:/ ...
- 快速搞定selenium grid分布式
写这篇文章,似乎有点重复造轮子的嫌疑.当看了几篇相关文章后,我还是决定把半年前的半成品给完成了. 以传统的方式部署分布式Selenium Grid集群需要耗费大量时间和机器成本来准备测试环境. Sna ...
- Selenium Grid分布式测试入门详解
本文对Selenium Grid进行了完整的介绍,从环境准备到使用Selenium Grid进行一次完整的多节点分布式测试. 运行环境为Windows 10,Selenium版本为 3.5.0,Chr ...
- Docker搭建wordpress博客环境(Centos7)
Docker搭建wordpress博客环境(Centos7) 升级系统 yum -y update 设置docker库 sudo yum install -y yum-utils sudo yum-c ...
- 用 Docker 搭建 ORACLE 数据库开发环境
用 Docker 搭建 ORACLE 数据库开发环境 需要安装 ORACLE 数据库做开发,直接安装的话因为各类平台的限制,非常复杂,会遇到很多问题. 还好,现在有 Docker 化的部署方式,省去很 ...
- 如何通过Docker搭建一个swoft开发环境
本篇文章给大家分享的内容是关于如何通过Docker搭建一个swoft开发环境 ,内容很详细,有需要的朋友可以参考一下,希望可以帮助到你们. Swoft首个基于 Swoole 原生协程的新时代 PHP ...
- selenium===使用docker搭建selenium分布式测试环境
准备: #请在此之前先了解,selenium grid :参考:selenium-grid ,下载地址,win-本地部署过程 >>>环境准备: Linux操作系统 >>& ...
- Selenium Grid分布式测试环境搭建
Selenium Grid简介 Selenium Grid实际上是基于Selenium RC的,而所谓的分布式结构就是由一个hub节点和若干个node代理节点组成.Hub用来管理各个代理节点的注册信息 ...
- 搭建selenium grid简单配置
1.使用selenium提供的服务端独立jar包 :服务端.客户端都是运行于java7环境. 2.启动hub: hub配置文件如下: Java -jar selenium-server-standal ...
随机推荐
- SQLite数据库迁移MySQL(MariaDB)完整步骤
第一步(SQLite导出数据库): 命令方式导出数据库 > .output d:/data/lagou.sql //导出路径及文件名 > .dump //开始导出 修改lagou.sql文 ...
- 在腾讯云centos7.2上安装配置Node.js记录
应为爱好前端所以打算在腾讯云服务器上安装JavaScript引擎Node.js,下面是安装步骤: 安装准备: 下载node.js的.tar.xz安装包:https://nodejs.org/dist/ ...
- 6.8.5 使用Lambda表达式调用Arrays的类方法
6.8.5 使用Lambda表达式调用Arrays的类方法 实例 Arrays类的有些方法需要Comparator. XxxOperator.XxxFunction等接口的实例,这些接口都是函数式接口 ...
- POJ 3522 用不同的排序方式
这是一个蜜汁WA了的代码.. 说好的样例对了就是对了呢orz 反正我个人认为思路是没问题的不知道WA在哪了,丢个坑在这里以后填吧 //思路: //1节点连接的边都记录下来,依次克鲁斯卡尔枚举得出最 ...
- tips [ 18870 ]
Created at 2017-08-23 Updated at 2018-01-31 Category 东方大陆 Tag 东方大陆 上面有编辑时间的,别吐槽说什么过期内容了使用 lightPIC图床 ...
- Scrapy初体验(一) 环境部署
系统选择centOs 7,Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中. 其最初是为了 页面抓取 (更确切来说, ...
- JavaScript闭包、Object对象
JavaScript闭包 定义:闭包指一个拥有许多变量和绑定这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分. function a(){ var i=0; function ...
- Maven本地仓库在C盘下无法自动下载相关依赖的问题
打开项目时用管理员权限!!!
- 5G时代,会有什么奇葩事儿?
在3GPP RAN第187次会议关于5G短码方案的讨论中,中国华为推荐的PolarCode方案获得认可,成为5G控制信道eMBB场景编码的最终解决方案.坦白讲,笔者在读这个新闻的时候,手里备着一本 ...
- CSS——NO.6(盒模型)
*/ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...