Selenium Grid 是 Selenium套件的一部分,它专门用于并行运行多个测试用例在不同的浏览器、操作系统和机器上

Selenium Grid有两个版本——老版本Grid 1和新版本Grid 2。我们只对新版本做介绍,因为Selenium团队已经逐渐遗弃老版本了

Selenium Grid主要使用 master-slaves (or hub-nodes) 理念 --一个 master/hub 和多个 基于master/hub注册的子节点 slaves/nodes。当我们在master上基于不同的浏览器/系统运行测试用例时,master将会分发给适当的node运行

注意,该博客用的是selenium grid 4.x的版本

安装

下载selenium grid的jar包:selenium-release.storage.googleapis.com/index.html

找到类似于selenium-server-standalone-<version>.jar的jar包,然后点击下载

使用java启动即可,如:

java -jar selenium-server-<version>.jar

角色

Selenium Grid中有两种主要角色:Hub和Node。

中心(Hub)

Hub是Selenium Grid的管理中心,负责接收所有的测试请求,并将这些请求分发到不同的Node上。同时,Hub还负责管理测试脚本,并将脚本发送给其他Node节点。所有的Node节点计算机都会先在Hub计算机中进行注册,注册成功后再和Hub计算机进行通信。此外,Hub还负责收集多个Node计算机执行结果的报告,并将这些报告汇总后提交一份总的测试报告。

一个Hub由以下组件组成: 路由器(Router)、分发器(Distributor)、会话映射(Session Map)、新会话队列(New Session Queue)和事件总线(Event Bus)。

java -jar selenium-server-standalone-<version>.jar hub

这将在指定端口(默认为4444)启动Selenium Hub,并使其可以接收来自客户端的连接请求。输入命令成功后如图:

在浏览器输入http://your-hub-ip:4444,进入画面证明成功

当你启动Hub时,可以通过 -port 参数来指定一个非默认的端口号(例如使用5555端口)

java -jar selenium-server-standalone-<version>.jar hub --port 5555

节点(Node)

Node则是实际执行测试的角色,可以理解为测试机器(如Linux/Windows/Mac)。在分布式测试模式中,可以有一个或者多个Node节点。Node节点会打开本地的浏览器完成测试任务,并将测试结果返回给Hub。此外,Node节点的操作系统和浏览器版本无需和Hub保持一致。

在启动时,Node将从系统的PATH中检测可用的驱动程序。

启动命令如下:

java -jar selenium-server-standalone-<version>.jar node

这将在指定端口(默认为5555)启动Selenium Node

Node可以配置其自身的代理Web驱动器绑定的端口,通过 -port 参数设置:

java -jar selenium-server-standalone-<version>.jar node --port 5556

同一台机器的多个node

以下命令假设Node正在运行的机器与Hub在同一台机器上。

Node 1

java -jar selenium-server-standalone-<version>.jar node --port 5556

Node 2

java -jar selenium-server-standalone-<version>.jar node --port 6666

不同机器上的Node和Hub

HubNodes通过HTTP和事件总线事件总线位于Hub内部)进行通信。

Node通过事件总线向Hub发送消息以开始注册过程。当Hub收到消息时,通过HTTP与Node联系以确认其存在。

要成功将Node注册到Hub,重要的是要在Hub机器上公开事件总线端口(默认为4442和4443)。这也适用于Node端口。有了这个,HubNode都能够通信。

Hub使用默认端口时,需要使用--publish-events--subscribe-events

java -jar selenium-server-standalone-<version>.jar node --detect-drivers true --publish-events tcp://<hub-ip>:4442 --subscribe-events tcp://<hub-ip>:4443

刷新Hub,可以看到已经注册了节点了

对于更复杂的设置,比如指定特定的浏览器版本、最大会话数等,可以创建一个JSON配置文件(如 node-config.json),并在启动Node时引用该配置文件:

{
  "capabilities": [
    {
      "browserName": "chrome",
      "maxInstances": 5,
      "seleniumProtocol": "WebDriver"
    }
  ],
  "role": "node",
  "maxSession": 5,
  "register": true,
  "hubHost": "<hub-ip>",
  "hubPort": 4443
}

然后启动Node时指明配置文件路径:

java -jar selenium-server-standalone-<version>.jar node --config=node-config.json

例如,如果Hub使用端口8886、8887和8888。

java -jar selenium-server-standalone-<version>.jar hub --publish-events tcp://<hub-ip>:8886 --subscribe-events tcp://<hub-ip>:8887 --port 8888

Node需要使用这些端口才能成功注册。

java -jar selenium-server-standalone-<version>.jar node --publish-events tcp://<hub-ip>:8886 --subscribe-events tcp://<hub-ip>:8887

脚本调用

python

在Selenium Grid中,当你通过Python脚本连接到Hub时,并不需要直接指定具体的Node。你只需要通过webdriver.Remote()函数向Hub发送请求,其中包含所需的浏览器类型、版本以及其他配置信息(如平台等)。

Hub会根据你提供的capabilities自动调度和分配一个符合条件的Node来执行你的测试脚本。当Hub接收到请求后,它会在已注册的Node列表中找到一个能满足需求的Node,然后将WebDriver命令转发给这个Node上的浏览器实例执行。

以下是简化的流程:

  1. Python脚本通过Hub URL与Hub建立远程连接。

  2. 脚本定义了需要的浏览器类型、版本等capability信息。

  3. Hub接收到请求后,查找匹配这些capability的Node。

  4. 找到匹配的Node后,Hub将WebDriver命令转发给该Node。

  5. Node上的浏览器执行实际的WebDriver命令。

所以,在编写Python脚本时,你只需关注如何正确地定义capabilities以及与Hub的连接,至于具体调用哪个Node,这部分由Grid Hub自行管理。

# coding=utf-8
from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

# 指定Grid Hub的URL
hub_url = "http://localhost:4444/wd/hub"

# 定义要使用的浏览器类型与版本,这里是Chrome
capabilities = DesiredCapabilities.CHROME.copy()
# 如果Node上注册了特定版本的浏览器,可以指定版本信息
capabilities["browserName"] = "chrome"
# 可选参数,比如平台、版本等
# capabilities["platform"] = "WINDOWS"

# 连接到Grid Hub,并请求一个匹配上述capabilities的浏览器会话
driver = webdriver.Remote(command_executor=hub_url, desired_capabilities=capabilities)

# 现在你可以像操作本地WebDriver一样操作远程浏览器
driver.get("https://www.example.com")

# ... 执行你的测试脚本 ...

# 最后记得关闭浏览器会话
driver.quit()

Grid 的规模

选择 Grid 角色取决于需要支持什么操作系统和浏览器、需要执行多少个并行会话、可用机器的数量以及这些机器的配置(CPU、RAM)。

并发创建会话依赖于 分配器 的可用处理器。 例如,如果一台机器有 4 个 CPU,则 分配器 最多只能同时创建 4 个会话。

默认情况下,Node 支持的最大并发会话数受可用 CPU 数量的限制。 例如,如果 Node 机器有 8 个 CPU,它最多可以运行 8 个并发浏览器会话(Safari 除外,它始终是一个)。 此外,预计每个浏览器会话应使用大约 1GB 的 RAM。

通常,建议 Nodes 尽可能小。 与其让机器有 32 个 CPU 和 32GB RAM 来运行 32 个并发浏览器会话,不如有 32 个小的 Node,以便更好地隔离进程。 有了这个,如果一个 Node 发生故障,它将以孤立的方式进行。 Docker 是实现这种方法的好工具。

请注意,默认值(每个浏览器 1 个 CPU/1GB RAM)是建议值,它们不适用于您的上下文。 建议将它们用作参考,但持续测量性能将有助于确定您的环境的理想值。

Grid 大小与支持的并发会话数量和 Node 数量有关,没有“一刀切”的说法。 下面提到的尺寸是粗略的估计,不同环境之间可能会有所不同。 例如,当 Hub 具有足够的资源时,具有 120 个 Nodes 的 Hub/Node 可能运行良好。 以下值并非一成不变,欢迎提供反馈!

小规模

Standalone 或 Hub/Node 不超过5个 Nodes.

中等规模

Hub/Node 介于6到60个 Nodes 之间。

大规模

Hub/Node 介于60到100个 Nodes 之间, Distributed 超过100个 Nodes。

文章作者: Vsoapmac
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 soap的会员制餐厅
自动化测试 个人分享 框架 Linux
喜欢就支持一下吧