Selenium Grid 2

Selenium Grid 2 支持 WebDriver 和 Selenium RC。它被删除了 RC 代码的 Grid 3 取代。Grid 3 为新的 Grid 4 进行了完全重写。

此文档之前位于维基
您可以阅读我们的文档,了解更多关于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 节点,您需要使用 RemoteWebDriverDesiredCapabilities 对象来定义您希望使用的浏览器、版本和平台。创建您希望针对其运行测试的目标浏览器功能

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_FAILEDHub 无法转发到节点。内存不足错误/节点稳定性问题或网络问题
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

上次修改时间:2022 年 1 月 10 日:更多 wiki (#907) [部署站点] (adcf706a1ad)