跨平台设备管理方案 Selenium Grid

跨平台设备管理方案 Selenium Grid

1. 简介

Selenium Grid 可以远程运行 Selenium Test,主旨是在多个机器上并行运行 Selenium。一个服务端发送 JSON 命令给已注册的 GridNodes。测试联系 hub 以获得对远程浏览器实例的访问。hub 有一个注册服务器列表,它提供对这些服务器的访问,并允许控制这些实例。

当测试脚本执行时间变长,测试工作也随之加大,如何节省时间成为难题,Selenium Grid 可以解决多任务时间问题,使用分布式将任务分发至每个节点,多任务分发以减轻单计算机压力,Selenium Grid 存在如下优点:

  • 所有测试的中心入口点
  • 管理和控制浏览器运行的 Nodes/环境
  • 扩展
  • 并行运行测试
  • 跨平台的测试
  • 负载平衡

2. 环境安装

从官网下载 Selenium Server (Grid),这是一个 jar 包,它包含了 server 与 nodes:

官网:https://www.selenium.dev/downloads/

3. 使用

Grid 由两个重要部分组成,Hub 和 Nodes:

图片标题

其中 Hub 是中介,从客户端获取指令并在 Nodes 上远程执行它们, Hub 是发送所有测试的中心点。Selenium Grid 必须存在一个 Hub 用来调度 Node 运行,Hub 可以放到单独的机器人(如CI服务器、开发人员机器等)。

Nodes 布署在另外一台计算机上,可以执行测试用例。Selnium Grid 中可以存在多个Nodes。一个 Nodes 不需要与 Hub 或其他 Nodes 具有相同的平台或相同的浏览器。比如 Windows 上的一个 Nodes 可能有提供 Internet Explorer,但在 Linux 或 Mac 只能是 Chrome 或者 Firefox。

Grid 文档:https://github.com/SeleniumHQ/selenium/wiki/Grid2

步骤1:开启 Hub

通过下面命令启动 hub,它默认监听 4444 端口,也可以用参数 -port 改变端口:

java -jar selenium-server-standalone.jar -role hub

其它的配置项可以用配置文件,比如下面就指定了 hubConfig.json 这个配置文件:

java -jar selenium-server-standalone.jar \
-role hub -hubConfig hubConfig.json -debug

下面是一个 hubConfig.json 文件,字段中包括 host 地址,端口号,超时时间等等:

{
  "port": 4444,
  "newSessionWaitTimeout": -1,
  "servlets" : [],
  "withoutServlets": [],
  "custom": {},
  "capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
  "registry": "org.openqa.grid.internal.DefaultGridRegistry",
  "throwOnCapabilityNotPresent": true,
  "cleanUpCycle": 5000,
  "role": "hub",
  "debug": false,
  "browserTimeout": 0,
  "timeout": 1800
}

步骤2:开启 Nodes

依旧使用上面的 jar 包,启动 Nodes,它会随机分配端口,一个机器上可以开多个 Nodes:

java -jar selenium-server-standalone.jar -role node -hub http://localhost:4444

可以在 -jar 之前输入一些命令,这些命令会被传递给 Nodes,比如:

java -Dwebdriver.chrome.\
driver=chromedriver.exe -jar selenium-server-standalone.jar \
-role node -nodeConfig node1Config.json

Nodes 也可以用 JSON 文件进行配置,包括使用何种浏览器,所在平台,最大实例数等:

{
  "capabilities":
  [
    {
      "browserName": "chrome",
      "maxInstances": 5,
      "seleniumProtocol": "WebDriver"
    }
  ],
  "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
  "maxSession": 5,
  "port": -1,
  "register": true,
  "registerCycle": 5000,
  "hub": "http://localhost:4444",
  "nodeStatusCheckTimeout": 5000,
  "nodePolling": 5000,
  "role": "node",
  "unregisterIfStillDownAfter": 60000,
  "downPollingLimit": 2,
  "debug": false,
  "servlets" : [],
  "withoutServlets": [],
  "custom": {}
}

关于 -host 标志的说明:

Hub 和 Nodes,如果没有指定 -host标志,则默认使用0.0.0.0。这将绑定到机器的所有公共(非环回)IPv4接口。如果有一个特殊的网络配置或任何创建额外网络接口的组件,建议使用一个值来设置 -host 标志,该值允许从不同的机器访问 Hub/Nodes。

4. 案例

Selenium 测试用例可以单机运行,但为了执行速度与可靠性,往往选择多机分发执行,下面使用Selenium Grid 实现多机分发。

使用 hub 分发 selenium 测试用例,在电脑上开启 hub 节点:

java -jar selenium-server-standalone-3.141.59.jar -role hub

如果执行成功,会显示如下字段,表示 hub 已经启成功并监听 4444 端口:

Launching Selenium Grid hub on port 4444
Logging initialized @680ms to org.seleniumhq.jetty9.util.log.StdErrLog
Selenium Grid hub is up and running
Nodes should register to http://172.17.0.1:4444/grid/register/
Clients should connect to http://172.17.0.1:4444/wd/hub

开启两个 node 节点:

java -jar selenium-server-standalone-3.141.59.jar  \
-role node -nodeConfig node.json

java -jar selenium-server-standalone-3.141.59.jar  \
-role node -nodeConfig node.json

node1 节点和 node2 节点的配置(node.json)如下,其中指定浏览器名为 Chrome,使用 WebDriver 协议,chromedriver 要提前放入环境变量:

{
  "capabilities":
  [
    {
      "browserName": "chrome",
      "maxInstances": 5,
      "seleniumProtocol": "WebDriver"
    }
  ],
  "proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy",
  "maxSession": 5,
  "port": -1,
  "register": true,
  "registerCycle": 5000,
  "hub": "http://localhost:4444",
  "nodeStatusCheckTimeout": 5000,
  "nodePolling": 5000,
  "role": "node",
  "unregisterIfStillDownAfter": 60000,
  "downPollingLimit": 2,
  "debug": false,
  "servlets" : [],
  "withoutServlets": [],
  "custom": {}
}

如果注册成功,在后面的链接中可看到这两个 node:http://127.0.0.1:4444/grid/console/

图片标题

Python 代码如下,首先将脚本发送给 selenium hub,hub 会根据 DesiredCapabilities 寻找匹配的 node,如果找到,就进行代码分发执行:

from selenium.webdriver import Remote
from selenium.webdriver import DesiredCapabilities


selenium_grid_url = "http://127.0.0.1:4444/wd/hub"
capability = DesiredCapabilities.CHROME.copy()
for i in range(1,5):
    driver = Remote(command_executor=selenium_grid_url, desired_capabilities=capability)
    driver.get("https://www.baidu.com/")

代码中的 capability 还可以指定其它字段,具体字段内容可查看官网:

capability['platform'] = "WINDOWS"
capability['version'] = "10"

目前启动的 hub 与 node 是在一台主机。如果在其它主机启动 node 需要具备以下条件:

  • hub 主机与 node 主机处于同一网段
  • node 主机需要安装脚本的运行环境(Python 、Selenium、浏览器及浏览器驱动)
  • node 主机需要安装 Java 以运行 SeleniumServer

小结

以上,在了解跨平台设备管理方案 SeleniumGrid 之后,我们进一步学习 Jenkins 持续集成体系构建知识。

<p> 专刊包含了10+年经验测试架构师对测试职业发展的深度解读 帮助你掌握当下 BAT 流行的 App 自动化测试技术基础技能和工具使用;以及从入门到进阶的自动化测试实战经验,在面试中能够脱颖而出。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p> <p> <br /> </p>

全部评论

相关推荐

程序员牛肉:你这简历有啥值得拷打的?在牛客你这种简历一抓一大把,也就是个人信息不一样而已。 关键要去找亮点,亮点啊,整个简历都跟流水线生产出来的一样。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务