最近需要测试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/hubselenium/node-chromeselenium/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分布式环境实践之路的更多相关文章

  1. 使用docker搭建selenium grid 分布式环境

    本文章只做docker搭建selenium grid 分布式环境步骤说明,对于selenium grid中的参数.流程.原理等不做说明.selenium grid的详细情况可查看官方文档https:/ ...

  2. 快速搞定selenium grid分布式

    写这篇文章,似乎有点重复造轮子的嫌疑.当看了几篇相关文章后,我还是决定把半年前的半成品给完成了. 以传统的方式部署分布式Selenium Grid集群需要耗费大量时间和机器成本来准备测试环境. Sna ...

  3. Selenium Grid分布式测试入门详解

    本文对Selenium Grid进行了完整的介绍,从环境准备到使用Selenium Grid进行一次完整的多节点分布式测试. 运行环境为Windows 10,Selenium版本为 3.5.0,Chr ...

  4. Docker搭建wordpress博客环境(Centos7)

    Docker搭建wordpress博客环境(Centos7) 升级系统 yum -y update 设置docker库 sudo yum install -y yum-utils sudo yum-c ...

  5. 用 Docker 搭建 ORACLE 数据库开发环境

    用 Docker 搭建 ORACLE 数据库开发环境 需要安装 ORACLE 数据库做开发,直接安装的话因为各类平台的限制,非常复杂,会遇到很多问题. 还好,现在有 Docker 化的部署方式,省去很 ...

  6. 如何通过Docker搭建一个swoft开发环境

    本篇文章给大家分享的内容是关于如何通过Docker搭建一个swoft开发环境 ,内容很详细,有需要的朋友可以参考一下,希望可以帮助到你们. Swoft首个基于 Swoole 原生协程的新时代 PHP ...

  7. selenium===使用docker搭建selenium分布式测试环境

    准备: #请在此之前先了解,selenium grid :参考:selenium-grid ,下载地址,win-本地部署过程 >>>环境准备: Linux操作系统 >>& ...

  8. Selenium Grid分布式测试环境搭建

    Selenium Grid简介 Selenium Grid实际上是基于Selenium RC的,而所谓的分布式结构就是由一个hub节点和若干个node代理节点组成.Hub用来管理各个代理节点的注册信息 ...

  9. 搭建selenium grid简单配置

    1.使用selenium提供的服务端独立jar包 :服务端.客户端都是运行于java7环境. 2.启动hub: hub配置文件如下: Java -jar selenium-server-standal ...

随机推荐

  1. log4j.properties总结

    一.以自己的log4j.properties为例: # 配置根Logger,格式:log4j.rootLogger = [ level ] , appenderName1, appenderName2 ...

  2. annoy超平面多维近似向量查找工具

    需求:有800万的中文词向量,要查询其中任意一个词向量对应的k个与其最邻近的向量.通常情况下如果向量集比较小的话,几十万个向量(几个G这种),我们都可以用gensim的word2vec来查找,但是88 ...

  3. ElasticSearch系列四 CURD

    1: ES 类似JPA操作 1.1 编写实体类 1.2 编写映射文件 xxx.json 1.3编写repository继承 ElasticSearchrepository 1.4 编写admin 的C ...

  4. C++走向远洋——33(静态成员的应用)

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:time.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  5. android逆向---charles抓包

    手机与电脑处于同一网络环境,且正确设置代理后,charles显示CONNECT失败,提示信息SSL handshake with client failed: An unknown issue occ ...

  6. Go语言基础篇(1) —— 编写第一个Go程序

    创建文件hello_world.go package main //包,表名代码所在的包 import "fmt" //引入依赖 //main方法 func main(){ fmt ...

  7. Simple: 一个支持中文和拼音搜索的 sqlite fts5插件

    之前的工作关系,需要在手机上支持中文和拼音搜索.由于手机上存储数据一般都是用 sqlite,所以是基于 sqlite3 fts5 来实现.这段时间再次入门 c++,所以想用 c++ 实现一下,一来用于 ...

  8. Windows10 JDK1.8安装及环境变量配置

    一.下载JDK1.8: 下载地址:https://www.oracle.com/java/technologies/javase-jdk8-downloads.html  二.安装步骤: 我们通常选择 ...

  9. 开放融合易用@门户移动开发新体验-逐浪CMS v8.0.1全面发布

    北京时间2019年8月30日消息: 领先的web内核研发厂商--上海Zoomla!逐浪CMS团队发布最新CMS版本:Zoomla!逐浪CMS v8.0.1,这是继上个版本v8.0后功能最具完强大与精彩 ...

  10. Simulink仿真入门到精通(十九) 总结回顾&自我练习

    从2019年12月27到2020年2月12日,学习了Simulink仿真及代码生成技术入门到精通,历时17天. 学习的比较粗糙,有一些地方还没理解透彻,全书梳理总结: Simulink的基础模块已基本 ...