Selenium 3
1 - 服务网格 3
Most of the documentation found in this section is still in English. Please note we are not accepting pull requests to translate this content as translating documentation of legacy components does not add value to the community nor the project.
Selenium服务网格 是一个能够让Selenium的测试把命令传送到一个远程浏览器实例的职能代理服务器。 他的目的是提供一个简便的方法来在多台终端上并行的执行测试任务。
在Selenium服务网格, 一台服务器作为转发器(hub)将JSON格式的测试命令转发到1台或多台注册的节点。 测试任务通过跟转发器(hub)的交互来操作远端浏览器实例。 转发器(hub)维护了一个可供使用的注册服务器列表,也允许我们通过转发器(hub)来控制这些实例。
Selenium服务网格允许我们在多台节点服务器上并行执行测试, 同时也中心化的管理多个浏览器版本,多种浏览器的配置。(以替代传统的基于个人的测试)
Selenium服务网格并不是万能的(silver bullet)。 它能够解决一些通用的代理问题和分布式的问题,但是并不能管理你的硬件,也可能不适合你的一些特殊需求。
2 - 配置自己的服务网格
使用Selenium网格, 你需要维护你自己的基础设置来作为节点使用, 这将是一个繁重的紧张的工作,很多组织使用IaaS供应商比如Amazon EC2或者Google来提供这些基础设施。
使用Sauce Labs或者Testing Bot这类提供了Selenium网格作为云服务的供应商也是一个选择。 当然,在你自己的硬件群运行节点也是可行的。 这一章会深入探讨如何用你自己的基础设施来运行你的服务网格,
快速开始
这个例子会向你展示如何开始Selenium 2服务网格的转发器(hub), 然后注册WebDriver节点和Selenium 1 RC节点。 我们也会向你展示如何使用Java来使用Selenium服务网格。 这个例子里转发器和节点被运行在了同一台终端机上,当然你也可以服务selenium-server-standalone到 多台终端机。
selenium-server-standalone
包含了运行网格所需要的转发器(hub),WebDriver和legacy RC needed, _ant_已经不是必须的了.
你可以在https://selenium.dev/downloads/.下载
selenium-server-standalone.jar
第一步: 启动转发器(hub)
转发器(hub)是接受测试请求并分发到合适的节点的中心点。 分发是基于节点的能力的,这就意味着一个有特定需求的测试仅会被分发到能提供这个需求的节点上。
因为一个测试所期望的能力,就如字面意思,期望,并不代表转发器(hub)能够找到一个真正满足所有期望的节点。
打开命令行窗口,来到存放selenium-server-standalone.jar
文件的地方。
启动转发器(hub)并传入-role hub
作为参数来启动一个独立的服务:
java -jar selenium-server-standalone.jar -role hub
转发器(hub)默认会监听4444端口,你也可以通过打开浏览器访问http://localhost:4444/grid/console来查看转发器(hub)的状态。
如果需要改变默认端口,你可以添加-port
加上一个数字作为参数来代表你期望监听的端口,
同时,所有其他的可选参数都可以在下面这个JSON配置文件里找到。
你已经在上面获得了一个简单命令,当然如果你希望一些更高级的配置, 方便起见,你也可以指定一个JSON格式的配置文件来配置并启动你的转发器(hub)。 你可以这么做:
java -jar selenium-server-standalone.jar -role hub -hubConfig hubConfig.json -debug
下面你可以看到一个配置文件hubConfig.json
的例子。
我们会在第二步深入探讨怎么来提供节点配置文件。
{
"_comment" : "Configuration for Hub - hubConfig.json",
"host": ip,
"maxSession": 5,
"port": 4444,
"cleanupCycle": 5000,
"timeout": 300000,
"newSessionWaitTimeout": -1,
"servlets": [],
"prioritizer": null,
"capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
"throwOnCapabilityNotPresent": true,
"nodePolling": 180000,
"platform": "WINDOWS"}
第二部: 启动节点
无论你期望你的服务网格使用新的WebDriver的功能,还是Selenium 1 RC的功能,或者2者皆有。
你都只需要使用selenium-server-standalone.jar
来启动节点。
java -jar selenium-server-standalone.jar -role node -hub http://localhost:4444
如果不通过-port
来指定端口,会选一个可用端口。你也可以在一个终端机上运行多个节点,
但是如果你这么做了,你需要意识到当你的测试使用截屏会引发你的系统内存资源和问题。
配置节点的可选参数
正如前面提到的,作为一个向下兼容,“wd"和”rc”这两个角色都是节点角色的合法的自己。 当节点同时允许RC饿WebDriver的远程链接时,这些角色限制了远程连接使用的API。
通过在命令行中设置JVM属性(_在-jar参数前_使用-D
参数),会被传递到节点里:
-Dwebdriver.chrome.driver=chromedriver.exe
使用JSON配置节点
你也可以使用JSON配置文件来启动服务网格节点
java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone.jar -role node -nodeConfig node1Config.json
这里是一个配置文件nodeConfig.json
的例子:
{
"capabilities": [
{
"browserName": "firefox",
"acceptSslCerts": true,
"javascriptEnabled": true,
"takesScreenshot": false,
"firefox_profile": "",
"browser-version": "27",
"platform": "WINDOWS",
"maxInstances": 5,
"firefox_binary": "",
"cleanSession": true
},
{
"browserName": "chrome",
"maxInstances": 5,
"platform": "WINDOWS",
"webdriver.chrome.driver": "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
},
{
"browserName": "internet explorer",
"maxInstances": 1,
"platform": "WINDOWS",
"webdriver.ie.driver": "C:/Program Files (x86)/Internet Explorer/iexplore.exe"
}
],
"configuration": {
"_comment" : "Configuration for Node",
"cleanUpCycle": 2000,
"timeout": 30000,
"proxy": "org.openqa.grid.selenium.proxy.WebDriverRemoteProxy",
"port": 5555,
"host": ip,
"register": true,
"hubPort": 4444,
"maxSession": 5
}
}
有关于-host
参数的注解
无论是转发器还是节点,如果不指定-host
参数,会默认使用0.0.0.0
,
这么做会绑定终端机的所有的公共IPv4接口。如果你有一些特殊网络配置或者一些组件创建的网络接口,
建议设置-host
参数,来使你的转发器或节点能够被其他终端机访问。
指定端口
转发器默认使用TCP/IP端口4444.如果你希望改端口,请用上面提到的配置方法。
故障排查
使用日志文件
如果需要进行高级故障排查你可以指定一个日志文件来记录系统信息。 启动Selenium服务网格的转发器(hub)或节点的时候使用-log参数。下面是一个例子:
java -jar selenium-server-standalone.jar -role hub -log log.txt
使用你习惯的文本编辑器来打开日志文件(例子里用的log.txt),查找"ERROR"日志来定位你的问题。
使用 -debug
参数
同时,你也可以通过使用-debug
来向控制台打印debug日志。
启动Selenium服务网格的转发器(hub)或节点的时候使用-debug
参数。下面是一个例子:
java -jar selenium-server-standalone.jar -role hub -debug
提醒
Selenium服务网格需要使用合适的防火墙许可来隔离外部访问。
如果不能有效的保护你的服务网格,可能会导致以下问题:
- 提供了一个开发的接口来访问服务网格的基础设施
- 你将会允许第三方来访问内部web服务和文件
- 你将会允许第三方来执行定制的二进制文件
请参考这篇文章Detectify, 这里给了一个很好的概要, 关于暴露一个服务网格后会如何被滥用:Don’t Leave your Grid Wide Open.
Docker Selenium
Docker提供了一个方便的途径来在容器中构建一个可扩张的Selenium服务网格基础设置, 容器是软件的标准单元,包含了所有执行应用程序需要的东西,包括所有的依赖,它以一种可靠的,可以复制的方法来在不同的终端机上运行。
Selenium项目维护了一组Docker镜像,你可以下载并运行来快速的获得一个可用的服务网格。 Firefox和Chrome都提供了可用的镜像。你可以在Docker Selenium 找到关于如何启动服务网格的详细信息.
前提
创建服务网格的唯一的前提是安装了Docker并能正常运行 Install Docker.
3 - 服务网格的组件
转发器(hub)
- 中间人和管理者
- 接受请求 执行测试任务
- 接受客户端的指示并在远程节点上执行任务
- 管理进程
转发器(hub) 是一个接受所有所有测试任务的中心节点。 每个Selenium服务网格包含一个转发器(hub)。转发器(hub)需要能被所有的客户机(比如:持续集成服务器,开发机等等)访问到。 转发器(hub)会连接1个或者多个节点,这些节点会代理执行测试任务。
节点
- 浏览器会被安装在节点上
- 节点会把自己注册在转发器(hub)上并申报自己作为测试代理的能力(有些什么浏览器,每个浏览器可以运行几个实例等等)
- 接受转发器(hub)的指示并执行这些指示
节点 和不同的Selenium实例,他们能够在特定的计算机系统上执行测试。 一个服务网格中可以有很多节点。 这些终端设备并不需要使用统一的平台(或者说操作系统)也不需要选择相同的浏览器。 一个Windows节点可以提供IE作为一个浏览器选项来执行测试,然而Linux和MAC是不可能提供的。