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

用docker搭建selenium grid分布式环境实践之路,第1张

docker搭建seleniumgrid分布式环境实践之路

本文主要介绍用docker构建selenium网格分布式环境的实践。通过示例代码进行了非常详细的介绍,对于大家的学习或者工作都有一定的参考价值。有需要的朋友就跟着下面的边肖学习吧。

最近需要测试变焦视频会议,模拟100人加入会议。经过学习,zoom提供了直接通过url链接加入会议的方式(只能通过chrome浏览器或FireFox浏览器,因为使用的协议是webrtc)。

按照这个思路,可以使用Seleniumautomation同时启动多个浏览器进程,每个进程代表一个视频会议用户,从而达到模拟多方会议的效果。然而,有两个困难:

  • 多个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浏览器进程。也许你会想,这不就是资源问题吗?就不能加服务器吗?!但是如果你有服务器资源,你怎么安排任务呢?好在有SeleniumGrid,这是Selenium的三大组件,专门用来进行分布式测试。

    为此,设计了基于SeleniumGrid的测试方案:

  • 使用服务器作为中心,即主服务器。
  • 将剩余的机器注册为中心机器的节点。
  • 本地多进程执行Selenium自动化脚本(我用python语言实现了)。
  • 按照以上设计思路,理论上可以模拟100人同时参会。接下来,我们将与docker正式开始构建Selenium网格分布式环境的探索。

    硒罐包直接启动节点

    其实一开始我是用jar包直接启动节点的,少数节点还可以接受,但是节点多了就会特别麻烦。例如,如果要重新启动下一个节点,需要手动将其全部杀死,然后逐个启动。

    只要手动重复,就可以脚本化。于是我写了两个shell脚本,一个是根据传递的参数启动相应数量的节点;另一个脚本是杀死所有的节点进程。主脚本如下图所示:

    虽然脚本可以很容易地执行,但仍然不方便。先启动节点后,会增加很多java进程,没有办法查看单个节点的日志,因为所有节点的日志都是同时打印在控制台上的。所以考虑用docker来管理Selenium网格节点。

    直接用docker命令启动

    github上有现成的镜像:https://github.com/SeleniumHQ/docker-selenium.然后描述文档里也列出了所有可用的镜像名称,因为我主要用的是chrome浏览器,安装的都是:selenium/hub,selenium/node-chrome,selenium/node-chrome-debug,selenium/node-chrome-debug镜像会启动一个VNC服务器,在脚本执行期间,您可以本地连接到VNC服务器,并通过界面检查服务器的脚本执行情况。使用命令:

    $dockerpullselenium/hub $dockerpullselenium/node-chrome $dockerpullselenium/node-chrome-debug

    启动集线器的命令如下:

    $dockerrun-d-p4444:4444-eGRID_MAX_SESSION=100--namehubselenium/hub

    启动本地节点(中心节点和节点在同一台机器上)的命令如下:

    $dockerrun-d-p5555:5555-eNODE_MAX_INSTANCES=5-eNODE_MAX_SESSION=5--shm-size=2g--linkhub:hub--namenode1selenium/node-chrome

    启动远程节点(中心节点和节点不在同一台机器上)的命令如下:

    $dockerrun-d-pport:5555-eHUB_HOST=remote_ip-eHUB_PORT=remote_port-eREMOTE_HOST=http://ip:port-eNODE_MAX_INSTANCES=5-eNODE_MAX_SESSION=5--shm-size=2g--namenode1selenium/node-chrome

    这里需要注意的是,很多在线教程提供的启动命令都是一台机器上的hub和node。如果hub和node需要在不同的机器上,根据在线教程,虽然启动不会给出错误,但是node和hub之间的网络是无法通行的。

    但是,虽然可以直接使用docker命令查看单个节点的日志,但是它面临着和使用jar包一样的问题:启动多个节点非常不方便,需要手动执行多个命令。有更好的方案吗?当然,您可以使用docker-compose来集成docker容器。

    docker-compose开始

    Dockercompose是Docker的命令行工具,用来定义和运行由多个容器组成的应用。这相当于我们可以将多个docker命令放入一个文件,然后通过docker-compose一键执行它们。

    同样,有两种情况:

    中心和节点在同一台机器上

    您可以按如下方式使用配置文件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-composeup-d//-d表示在后台运行

    想同时启动多个节点,该怎么办?非常简单:

    $docker-composeup-d--scalechrome=num//num是要启动节点的数量

    如果要关闭节点,可以执行以下命令:

    $docker-composedown

    中心和节点不在同一台计算机上

    您可以按如下方式使用配置文件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"

    启动节点的命令是(前提是需要提前启动集线器):

    $docker-composeup-d

    关闭节点的命令是:

    $docker-composedown

    传统

    按照上面我设置Selenium网格环境的方式,本地节点可以正常运行,但是远程节点经常超时。但是从http://hub_IP:4444/grid/console界面看到的节点网络都是连通的。

    之前查了一些资料,好像需要用dockerSwarm,这是一个docker集群管理工具。它将多个Docker主机抽象成一个整体,通过一个门户来管理这些Docker主机上的各种Docker资源。不过,我还没研究过。如果以后我和DockerSwarm有了结论,我会写一篇文章给你同步。

    摘要

    用docker构建selenium网格分布式环境非常方便。基本上,一行命令可以启动或关闭节点。希望这篇文章能给你提供一些思路,帮助你解决日常工作中的一些问题。

    关于用docker构建selenium网格分布式环境的实践之路,本文到此为止。有关使用docker构建seleniumgrid分布式环境的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望大家以后能多多支持我们!

    欢迎分享,转载请注明来源:内存溢出

    原文地址: http://outofmemory.cn/zz/774580.html

    (0)
    打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
    上一篇 2022-05-03
    下一篇 2022-05-03

    发表评论

    登录后才能评论

    评论列表(0条)

    保存