Selenium Grid 2
此文档之前位于维基
您可以阅读我们的文档,了解更多关于Grid 4的信息
引言
Grid 允许您
- 通过在多台机器上分发测试来扩展(并行执行)
- 从中心点管理多个环境,使其可以轻松地针对各种浏览器/操作系统组合运行测试。
- 通过允许您实施自定义钩子来利用虚拟基础设施(例如)来最大程度地减少网格的维护时间。
快速入门
此示例将向您展示如何启动 Selenium 2 Hub,并注册一个 WebDriver 节点和一个 Selenium 1 RC 旧版节点。 我们还将向您展示如何从 Java 调用网格。 此处显示的 Hub 和节点在同一台计算机上运行,但您当然可以将 selenium-server-standalone 复制到多台计算机上。 注意:selenium-server-standalone 包包含运行网格所需的 Hub、WebDriver 和旧版 RC。不再需要 Ant。您可以从 http://selenium-release.storage.googleapis.com/index.html 下载 selenium-server-standalone-
*
.jar。本演练假设您已安装 Java。
步骤 1:启动 Hub
Hub 是接收所有测试请求并将其分发到正确节点的中心点。
打开命令提示符并导航到复制 selenium-server-standalone 文件的目录。键入以下命令
java -jar selenium-server-standalone-<version>.jar -role hub
默认情况下,Hub 将使用端口 4444 自动启动。要更改默认端口,您可以在运行命令时添加可选参数 -port。您可以通过打开浏览器窗口并导航到 http://localhost:4444/grid/console 来查看 Hub 的状态
步骤 2:启动节点
无论您是想使用新的 WebDriver 功能运行网格,还是使用 Selenium 1 RC 功能运行网格,还是同时运行两者,您都使用相同的 selenium-server-standalone jar 文件来启动节点。
java -jar selenium-server-standalone-<version>.jar -role node -hub http://localhost:4444/grid/register
注意:如果提供了“-role”选项且不是 hub,则端口默认设置为 5555(如果未指定)。
为了向后兼容,“wd”和“rc”角色仍然是“node”角色的有效子集。但是这些角色将远程连接的类型限制为它们对应的 API,而“node”允许 RC 和 WebDriver 远程连接。
使用 Grid 运行测试
(以 Java 为例)现在网格已就绪,我们需要从我们的测试用例访问网格。对于 Selenium 1 RC 节点,您可以继续使用 DefaultSelenium 对象并传入 Hub 信息
Selenium selenium = new DefaultSelenium(“localhost”, 4444, “*firefox”, “http://www.google.com”);
对于 WebDriver 节点,您需要使用 RemoteWebDriver 和 DesiredCapabilities 对象来定义您希望使用的浏览器、版本和平台。创建您希望针对其运行测试的目标浏览器功能
DesiredCapabilities capability = DesiredCapabilities.firefox();
将其传递到 RemoteWebDriver 对象中
WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
然后 Hub 会将测试分配给匹配的节点。
如果满足所有请求的功能,则节点匹配。要在网格上请求特定功能,请在将其传递到 WebDriver 对象之前指定它们。
capability.setBrowserName();
capability.setPlatform();
capability.setVersion()
capability.setCapability(,);
示例:使用以下设置注册的节点
-browser browserName=firefox,version=3.6,platform=LINUX
将匹配
capability.setBrowserName(“firefox” );
capability.setPlatform(“LINUX”);
capability.setVersion(“3.6”);
并且也将匹配
capability.setBrowserName(“firefox” );
capability.setVersion(“3.6”);
未指定的功能将被忽略。如果指定网格上不存在的功能(例如,您的测试指定了 Firefox 版本 4.0,但没有 Firefox 4 实例),则不会匹配,并且测试将无法运行。
配置节点
可以通过两种不同的方式配置节点;一种是通过指定命令行参数,另一种是通过指定 JSON 文件。
通过命令行配置节点
默认情况下,启动节点允许并发使用 11 个浏览器...:5 个 Firefox、5 个 Chrome、1 个 Internet Explorer。默认情况下,最大并发测试数设置为 5。要更改此设置和其他浏览器设置,您可以将参数传递给每个 -browser 开关(每个开关根据您的参数表示一个节点)。如果您使用 -browser 参数,则默认浏览器将被忽略,并且只会使用您指定的命令行。
-browser browserName=firefox,version=3.6,maxInstances=5,platform=LINUX
此设置在 Linux 计算机上启动 5 个 Firefox 3.6 节点。
如果您的远程计算机有多个您想使用的 Firefox 版本,您可以将每个二进制文件的位置映射到同一台计算机上的特定版本
-browser browserName=firefox,version=3.6,firefox_binary=/home/myhomedir/firefox36/firefox,maxInstances=3,platform=LINUX -browser browserName=firefox,version=4,firefox_binary=/home/myhomedir/firefox4/firefox,maxInstances=4,platform=LINUX
提示:如果您需要在浏览器参数中的某处提供空格,请用引号将参数括起来
-browser “browserName=firefox,version=3.6,firefox_binary=c:\Program Files\firefox ,maxInstances=3, platform=WINDOWS”
可选参数
-port 4444
(4444 是默认值)-host <IP | hostname>
指定主机名或 IP。通常不需要,会自动确定。对于特殊的网络配置、带有 VPN 的网络,可能需要指定主机。-timeout 30
(300 是默认值) 在 Hub 自动释放超过指定秒数没有收到任何请求的节点之前,超时时间(以秒为单位)。 此时间过后,该节点将被释放以进行队列中的另一个测试。 这有助于清除客户端崩溃,而无需手动干预。 要完全删除超时,请指定 -timeout 0,并且 Hub 永远不会释放该节点。
注意:这不是所有“等待 WebElement”类型命令的 WebDriver 超时。
-maxSession 5
(5 是默认值) 可以在节点上并行运行的最大浏览器数量。 这与支持的浏览器的 maxInstance 不同(例如:对于支持 Firefox 3.6、Firefox 4.0 和 Internet Explorer 8 的节点,maxSession=1 将确保您永远不会运行超过 1 个浏览器。使用 maxSession=2,您可以同时运行 2 个 Firefox 测试,或者 1 个 Internet Explorer 和 1 个 Firefox 测试)。-browser < params >
如果未设置 -browser,则节点将启动 5 个 Firefox 实例、1 个 Chrome 实例和 1 个 Internet Explorer 实例(假设它在 Windows 计算机上)。可以在同一行上多次设置此参数以定义多种类型的浏览器。 -browser 允许的参数:browserName={android, chrome, firefox, htmlunit, internet explorer, iphone, opera} version={浏览器版本} firefox_binary={可执行二进制文件的路径} chrome_binary={可执行二进制文件的路径} maxInstances={此类型浏览器的最大数量} platform={WINDOWS, LINUX, MAC}-registerCycle N
= 节点将尝试重新注册自身的频率(以毫秒为单位)。允许在不重新启动节点的情况下重新启动 Hub。真正大型(> 50 个节点)的 Hub 安装可能需要在 Java 命令行上设置 -DPOOL_MAX=512(或更大)来增加 Jetty 线程。
配置超时(需要 2.21 版本)
网格中的超时通常应通过 webDriver.manage().timeouts() 来处理,这将控制不同操作的超时方式。
为了保持使用 Selenium 服务器的网格的运行时完整性,还可以设置另外两个超时值。
在 Hub 上,将 -timeout 命令行选项设置为“30”秒将确保在客户端崩溃后 30 秒回收所有资源。在 Hub 上,您还可以设置 -browserTimeout 60,使节点在浏览器内部挂起的最长时间为 60 秒。这将确保在 60 秒后稍微回收所有资源。如果设置了这些值,所有节点都会使用来自 Hub 的这两个值。在单个节点上本地设置的参数具有优先权,通常建议不要在节点上设置这些超时。
browserTimeout 应该是
- 高于套接字锁超时(45 秒)
- 通常高于 webDriver.manage().timeouts() 中使用的值,因为这种机制是“最后一道防线”。
通过 JSON 配置节点
java -jar selenium-server-standalone.jar -role node -nodeConfig nodeconfig.json
服务器版本 3.x.x(>= beta4)的示例 nodeconfig 文件可以在这里找到:https://github.com/SeleniumHQ/selenium/blob/selenium-3.141.59/java/server/src/org/openqa/grid/common/defaults/DefaultNodeWebDriver.json
服务器版本 2.x.x 的示例 nodeconfig 文件可以在这里找到:https://github.com/SeleniumHQ/selenium/blob/selenium-2.53.0/java/server/src/org/openqa/grid/common/defaults/DefaultNode.json
注意:版本 2.x.x 中的 configuration { ... }
对象在版本 3.x.x(>= beta4)中已被扁平化
通过 JSON 配置 Hub
java -jar selenium-server-standalone.jar -role hub -hubConfig hubconfig.json
示例 hubconfig.json 文件可以在这里找到:https://github.com/SeleniumHQ/selenium/blob/selenium-3.141.59/java/server/src/org/openqa/grid/common/defaults/DefaultHub.json
Hub 诊断消息
检测到异常使用模式后,Hub 可以给出以下消息
Client requested session XYZ that was terminated due to REASON
原因 | 原因/修复 |
---|---|
TIMEOUT | 会话超时,因为客户端在超时时间内没有访问它。如果客户端以某种方式被暂停,则当它唤醒时可能会发生这种情况 |
BROWSER_TIMEOUT | 节点使浏览器超时,因为它挂起时间过长(参数 browserTimeout) |
ORPHAN | 队列中等待的客户端在被提供新会话后放弃了 |
CLIENT_STOPPED_SESSION | 会话是使用客户端上的普通停止/退出调用停止的。您为什么要再次使用它?? |
CLIENT_GONE | 客户端进程(您的 代码)似乎已死机或以其他方式没有响应我们的请求,间歇性网络问题也可能导致这种情况 |
FORWARDING_TO_NODE_FAILED | Hub 无法转发到节点。内存不足错误/节点稳定性问题或网络问题 |
CREATIONFAILED | 节点未能创建浏览器。当节点上存在环境/配置问题时,通常会发生这种情况。尝试直接使用节点来跟踪问题。 |
PROXY_REREGISTRATION | 会话已被丢弃,因为节点已在网格上重新注册(测试中间) |
使用 Grid 运行的技巧
如果您的测试是并行运行的,请确保每个线程独立于其他线程上运行的任何其他测试来释放其 webdriver 资源。在测试运行开始时每个线程启动 1 个浏览器,并在结束时释放所有浏览器不是一个好主意。(如果一个测试用例决定消耗异常的时间,您可能会在所有其他测试上获得超时,因为它们正在等待缓慢的测试。这可能会非常令人困惑)
Selenium Grid 平台
(以前位于:https://github.com/SeleniumHQ/selenium/wiki/Grid-Platforms)
本节描述了配置 Selenium Grid 节点和 [DesiredCapabilities] 对象中使用的 PLATFORM 选项。
平台历史
当从 Grid 请求新的 WebDriver 会话时,用户可以指定远程浏览器的 [DesiredCapabilities]。诸如浏览器名称、版本和平台之类的选项都在测试可以指定的选项列表中。指定 desired。
以下代码演示了 Windows XP 平台上 Internet Explorer 版本 9 的 DesiredCapability
[[DesiredCapabilities]] capability = DesiredCapabilities.internetExplorer();
capability.setVersion("8");
capability.setPlatform(Platform.XP);
WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
带有指定 DesiredCapability 的新会话的请求将发送到 Grid Hub,Grid Hub 将查看所有已注册的节点,以查看是否有任何节点与测试给定的规范匹配。如果没有节点匹配该规范,将返回 CapabilityNotPresentOnTheGridException。
一个常见的误解是,PLATFORM 决定了选择将在其上创建新会话的操作系统。在这种情况下,平台和操作系统不是同一回事,因此将平台指定为“Windows 2003 Server”将不允许您在 Windows XP、Vista 和 2003 服务器之间进行选择。这种误解可能源于诸如 Mac OSX 和 Linux 之类的平台,其中平台的名称与操作系统的名称匹配。
对于 Selenium Grid,平台指的是 Driver Atoms 和 Web 浏览器之间的底层交互。基于 Mac OSX 和 Linux 的操作系统(Centos、Ubuntu、Debian 等)与 Firefox 和 Chrome 等 Web 浏览器具有相对稳定的通信。因此,平台名称很容易理解,如下例所示
capability.setPlatform(Platform.MAC); //Set platform to OSX
capability.setPlatform(Platform.LINUX); // Set platform to Linux based systems
在 Vista 发布之前,基于 Windows 的操作系统只有一个平台,如下所示
capability.setPlatform(Platform.WINDOWS); //Set platform to Windows
但是,随着 Windows Vista 中 UAC 的引入,WebDriver 和 Internet Explorer 之间的底层交互发生了重大变化。为了解决 UAC 约束,在基于 Windows 操作系统的节点上添加了一个新平台
capability.setPlatform(Platform.VISTA); //Set platform to VISTA
随着 Windows 8 的发布,WebDriver 与 Internet Explorer 通信的方式又发生了重大改革,因此为基于 Windows 8 的节点添加了一个新平台
capability.setPlatform(Platform.WIN8); //Set platform to Windows 8
Windows 8.1 的引入也发生了类似的故事,在此示例中,平台设置为 Windows 8.1
capability.setPlatform(Platform.WIN8_1); //Set platform to Windows 8.1
操作系统平台
以下列表演示了一些操作系统及其所属的平台
MAC****所有 OSX 操作系统 LINUX Centos Ubuntu UNIXSolarisBSD XP Windows Server 2003 Windows XP Windows NT VISTAWindows VistaWindows 2008 Server****Windows 7 WIN8 Windows 2012 Server Windows 8 WIN8_1****Windows 8.1
系列
不同的平台被分组到“平台系列”中。例如,Win8 和 XP 平台是 WINDOWS 系列的一部分。同样,ANDROID 和 LINUX 是 UNIX 系列的一部分。
选择平台和平台系列
在 [DesiredCapabilities] 对象上设置平台时,我们可以设置单个平台或平台系列。例如
capability.setPlatform(Platform.VISTA); //Will return a node with Windows Vista or 2008 Server or Windows 7 Operating System.
capability.setPlatform(Platform.XP); //Will return a node with Windows XP or 2003 Server or Windows 2000 Professional Operating System.
capability.setPlatform(Platform.WINDOWS); //Will return a node with ANY Windows Operating System
更多信息
有关最新平台的更多信息,请查看此文件
org.openqa.selenium.Platform.java