跨平台设备管理方案 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:
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。
步骤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>
