用docker搭建selenium grid分布式环境实践之路

简介:

用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分布式环境,非常方便,基本是一行命令就能启动或者关闭节点。希望我这篇文章能给大家提供一些思路,帮助大家在平时的工作中解决一些问题。

还是那句话,任何技术,只要能帮你解决实际的问题,就是好的技术!

原文地址https://www.cnblogs.com/zhouliweiblog/p/12572047.html

相关文章
|
1月前
|
存储 运维 安全
盘古分布式存储系统的稳定性实践
本文介绍了阿里云飞天盘古分布式存储系统的稳定性实践。盘古作为阿里云的核心组件,支撑了阿里巴巴集团的众多业务,确保数据高可靠性、系统高可用性和安全生产运维是其关键目标。文章详细探讨了数据不丢不错、系统高可用性的实现方法,以及通过故障演练、自动化发布和健康检查等手段保障生产安全。总结指出,稳定性是一项系统工程,需要持续迭代演进,盘古经过十年以上的线上锤炼,积累了丰富的实践经验。
|
1月前
|
SQL 分布式计算 数据处理
云产品评测|分布式Python计算服务MaxFrame | 在本地环境中使用MaxFrame + 基于MaxFrame实现大语言模型数据处理
本文基于官方文档,介绍了由浅入深的两个部分实操测试,包括在本地环境中使用MaxFrame & 基于MaxFrame实现大语言模型数据处理,对步骤有详细说明。体验下来对MaxCompute的感受是很不错的,值得尝试并使用!
53 1
|
1月前
|
数据采集 人工智能 分布式计算
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
阿里云推出的MaxFrame是链接大数据与AI的分布式Python计算框架,提供类似Pandas的操作接口和分布式处理能力。本文从部署、功能验证到实际场景全面评测MaxFrame,涵盖分布式Pandas操作、大语言模型数据预处理及企业级应用。结果显示,MaxFrame在处理大规模数据时性能显著提升,代码兼容性强,适合从数据清洗到训练数据生成的全链路场景...
96 5
MaxFrame:链接大数据与AI的高效分布式计算框架深度评测与实践!
|
2月前
|
运维 Kubernetes 调度
阿里云容器服务 ACK One 分布式云容器企业落地实践
阿里云容器服务ACK提供强大的产品能力,支持弹性、调度、可观测、成本治理和安全合规。针对拥有IDC或三方资源的企业,ACK One分布式云容器平台能够有效解决资源管理、多云多集群管理及边缘计算等挑战,实现云上云下统一管理,提升业务效率与稳定性。
|
2月前
|
机器学习/深度学习 存储 运维
分布式机器学习系统:设计原理、优化策略与实践经验
本文详细探讨了分布式机器学习系统的发展现状与挑战,重点分析了数据并行、模型并行等核心训练范式,以及参数服务器、优化器等关键组件的设计与实现。文章还深入讨论了混合精度训练、梯度累积、ZeRO优化器等高级特性,旨在提供一套全面的技术解决方案,以应对超大规模模型训练中的计算、存储及通信挑战。
122 4
|
3月前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
102 8
|
3月前
|
安全 持续交付 Docker
深入理解并实践容器化技术——Docker 深度解析
深入理解并实践容器化技术——Docker 深度解析
110 2
|
3月前
|
持续交付 开发者 Docker
深入理解并实践容器化技术——Docker篇
深入理解并实践容器化技术——Docker篇
68 0
|
3月前
|
Kubernetes Linux Docker
容器化技术Docker入门与实践
容器化技术Docker入门与实践
85 0
|
3月前
|
Prometheus 监控 持续交付
深入理解Docker容器化技术:从基础到实践
深入理解Docker容器化技术:从基础到实践