什么是Selenium网格?
Selenium网格 是Selenium Suite的一部分,专门用于跨不同浏览器、操作系统和计算机并行运行多个测试。用户需要配置远程服务器才能执行测试。
Selenium Grid有两个版本–较旧的Grid 1和较新的Grid 2。我们将只关注网格2,因为网格1正逐渐被Selenium团队弃用。
Selenium Grid使用集线器-节点概念,只需在一台名为 集线器 ,但是执行将由不同的机器来完成,称为 节点 。
在本教程中,将了解-
- 什么是Selenium网格?
- Selenium网格何时使用?
- 网格1.0与网格2.0
- Selenium网格体系结构
- 如何设置Selenium网格?使用命令行
- 设计可在网格上运行的测试脚本
- 使用DesiredCapabilites对象
- 使用RemoteWebDriver对象
- 在网格上运行示例测试用例
- 基于JSON文件的Selenium网格配置
- 使用JSON配置节点
Selenium网格何时使用?
当要执行以下任一操作或同时执行两项操作时,应使用Selenium Grid:
同时针对不同的浏览器、操作系统和计算机运行测试。这将确保应用程序测试与多种浏览器-操作系统组合完全兼容。 节省执行测试套件的时间。如果将Selenium Grid设置为一次运行(比方说)4个测试,那么完成整个套件的速度将提高大约4倍。
网格1.0与网格2.0
以下是Selenium网1和Selenium网2的主要区别。
网格1 | 网格2 |
---|---|
Selenium Grid 1有自己的遥控器,这与Selenium RC服务器不同。它们是两个不同的程序。 | Selenium Grid现在与Selenium Server JAR文件捆绑在一起 |
需要安装和配置阿帕奇首先蚂蚁,然后才能使用栅格1。 | 不需要在网格2中安装Apache Ant。 |
只能支持Selenium RC命令/脚本。 | 可以同时支持Selenium RC和WebDriver脚本。 |
每个遥控器只能自动化一个浏览器。 | 一个遥控器最多可以自动操作5个浏览器。 |
Selenium网格体系结构
Selenium Grid有一个中心和节点架构。
集线器
- 集线器是加载测试的中心点。
- 网格中应该只有一个集线器。
- 集线器只在一台机器上启动,比方说,一台操作系统是Windows7、浏览器是IE的计算机。
- 包含集线器的机器将在其中运行测试,但是将看到浏览器在节点上是自动化的。
这些节点
- 节点是将执行加载到集线器上的测试的Selenium实例。
- 网格中可以有一个或多个节点。
- 节点可以在具有不同平台和浏览器的多台机器上启动。
- 运行节点的计算机不必与集线器的平台相同。
Selenium网格可以通过两种不同的方式设置;一个通过命令行,另一个通过JSON配置文件。
如何设置Selenium网格?使用命令行
在本节中,将使用2台机器。第一台计算机将是将运行的系统为简单起见,让我们将假设机器A的IP地址为192.168.1.3,而机器B的IP地址为192.168.1.4。
第一步
从下载Selenium Server这里。
第二步
可以将Selenium Server.jar文件放在硬盘驱动器中的任何位置。但对于普莱斯来说以下步骤将启动集线器和节点。
第三步
- 我们现在要启动一个枢纽。使用命令提示符,导航到Machine A的-C驱动器的根目录,因为这是我们放置Selenium Server的目录。
- 在命令提示符下,键入JAVA-JAR Selenium-server-Standalone-2.30.0.jar-Role Hub
- 集线器应该会成功启动。命令提示符应该类似于下图
第四步
验证集线器是否正在运行的另一种方法是使用浏览器。只需打开浏览器并转到http://localhost:4444/grid/console
此外,还可以通过在那里启动浏览器并转到“iporhostnameofmachineA”应该是运行集线器的机器的IP地址或主机名,来检查机器B是否可以访问集线器的Web界面。由于计算机A的IP地址是192.168.1.3,因此在计算机B的浏览器上应键入http://192.168.1.3:4444/grid/console
第五步
- 现在集线器已经设置好了,我们将启动一个节点。转到计算机B并在那里启动命令提示符。
- 导航到驱动器C的根目录,然后键入以下代码。我们使用了我们也使用端口5566,不过可以选择任何想要的自由端口号。
- 注意:如果使用Firefox,现在必须给出壁虎驱动程序的路径。以下是需要使用的更新代码
java -Dwebdriver.gecko.driver="C:\geckodriver.exe" -jar selenium-server-standalone-3.4.0.jar -role webdriver -hub http://192.168.1.3:4444/grid/register -port 5566
- 当按Enter键时,命令提示符应该类似于下图。
第六步
转到Selenium Grid web界面并刷新页面。应该看看这样的东西。
此时,已经配置了一个简单的网格。现在可以在计算机B上远程运行测试了。
设计可在网格上运行的测试脚本
要设计将在网格上运行的测试脚本,我们需要使用 DesiredCapablites(预留功能) 以及 RemoteWebDriver 对象。
- DesiredCapablites(预留功能) 用于设置 浏览器 和 操作系统 我们将把它自动化
- RemoteWebDriver 用于设置我们的测试将在哪个节点(或机器)上运行。
要使用 DesiredCapablites(预留功能) 对象,则必须首先导入此包。
要使用 RemoteWebDriver 对象,则必须导入这些包。
使用DesiredCapabilites对象
转到网格的Web界面,并将鼠标悬停在要自动操作的浏览器图像上。注意 站台, 以及 浏览器名称 由工具提示显示。
在本例中,平台是“XP”,浏览器名称是“Firefox”。
我们将在WebDriver中使用平台和BrowserName,如下所示(当然,首先需要导入必要的包)。
使用RemoteWebDriver对象
为RemoteWebDriver导入必要的包,然后将上面创建的DesiredCapability对象作为参数传递给RemoteWebDriver对象。
在网格上运行示例测试用例
下面是一个简单的WebDriverTestNG可以在机器A上的Eclipse中创建的代码。一旦运行它,将在机器B上执行自动化。
测试应该会通过。
使用JSON文件配置Selenium网格:
JSON代表Javascript对象表示法。它是用于INTERT的标准格式Selenium有一个内置的JSON配置文件,可用于设置Selenium网格。
下面是使用JSON配置文件配置Selenium网格的步骤。
步骤1) 使用以下路径下载JSON配置文件的代码https://github.com/SeleniumHQ/selenium/blob/selenium-3.141.59/java/server/src/org/openqa/grid/common/defaults/DefaultHub.json
这是代码
{
"port": 4444,
"newSessionWaitTimeout":-1,
"servlets" :[],
"withoutServlets":[],
"custom":{},
"capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
"registryClass": "org.openqa.grid.internal.DefaultGridRegistry",
"throwOnCapabilityNotPresent":true,
"cleanUpCycle": 5000,
"role": "hub",
"debug": false,
"browserTimeout": 0,
"timeout": 1800
}
步骤2) 将代码复制并粘贴到扩展名为‘.json’的文本编辑器(如记事本)上
步骤3) 在命令提示符下使用以下命令启动集线器
java -jar selenium-server-standalone-2.53.1.jar -role hub -hubConfig hubconfig.json
注:Selenium独立JAR文件和json文件必须位于同一目录中
步骤4) 将出现以下屏幕,指示集线器设置成功
步骤5) 打开Web浏览器并尝试连接到以下URL
http://192.168.43.223:4444/grid/console
注:URL可能因计算机而异。必须使用上面屏幕上后跟“节点应注册到”的URL。
步骤6) 将出现网格控制台屏幕,指示集线器已启动并正在运行
使用JSON配置节点:
步骤1) 使用以下URL下载Selenium提供的示例节点配置文件https://github.com/SeleniumHQ/selenium/blob/selenium-2.53.0/java/server/src/org/openqa/grid/common/defaults/DefaultNode.json
注:如果使用的是Selenium 3.0或更高版本,则必须使用以下JSON文件
https://github.com/SeleniumHQ/selenium/blob/selenium-3.141.59/java/server/src/org/openqa/grid/common/defaults/DefaultNodeWebDriver.json
步骤2) 将代码复制并粘贴到文本编辑器(如记事本)中,并使用扩展名‘.json’保存文件
步骤3)
在命令提示符下运行以下命令
Java-Dwebdriver.chrome.driver="chromedriver.exe" -Dwebdriver.ie.driver="IEDriverServer.exe" -Dwebdriver.gecko.driver="geckodriver.exe" -jar selenium-server-standalone-2.53.1.jar -role node -nodeConfig node1.json
注:在运行该命令之前,确保已将每个浏览器的驱动程序下载到本地计算机目录
步骤4) 按Enter键时将出现以下屏幕
步骤5) 导航到网格控制台以验证节点是否已成功配置
浏览器显示在网格控制台上。因此,我们可以确保节点配置成功。
Selenium Grid上的示例测试用例:
package com.objectrepository.demo;
import org.openqa.selenium.*;
import org.openqa.selenium.remote.DesiredCapabilities;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.testng.Assert;
import org.testng.annotations.*;
public class SeleniumGrid {
WebDriver driver;
String baseURL, nodeURL;
@BeforeTest
public void setUp() throws MalformedURLException {
baseURL = "http://www.itxiaonv.com/test/guru99home/";
nodeURL = "http://192.168.43.223:4444/wd/hub";
DesiredCapabilities capability = DesiredCapabilities.chrome();
capability.setBrowserName("chrome");
capability.setPlatform(Platform.WIN10);
driver = new RemoteWebDriver(new URL(nodeURL), capability);
}
@AfterTest
public void afterTest() {
driver.quit();
}
@Test
public void sampleTest() {
driver.get(baseURL);
if (driver.getPageSource().contains("MOBILE TESTING")) {
Assert.assertTrue(true, "Mobile Testing Link Found");
} else {
Assert.assertTrue(false, "Failed: Link not found");
}
}
}
上面的代码启动Chrome浏览器并导航到‘baseURL’变量中指定的URL。它验证了页面上是否显示了一个名为“Mobile Testing”的链接
可以修改“nodeURL”变量上的URL以反映远程计算机的IP地址。可以在生成的默认TestNG报告上验证测试结果
总结
- Selenium Grid用于在不同的浏览器和平台上同时运行多个测试。
- 网格使用枢纽-节点概念。
- 集线器是加载测试的中心点。
- 节点是将执行加载到集线器上的测试的Selenium实例。
- 要安装Selenium Grid,只需下载Selenium Server JAR文件-与运行Selenium RC测试时使用的文件相同。
- 有两种方法可以验证集线器是否正在运行:一种是通过命令提示符,另一种是通过浏览器
- 要在网格上运行测试脚本,应使用DesiredCapability和RemoteWebDriver对象。
- DesiredCapabilites用于设置我们将自动化的浏览器和操作系统的类型
- RemoteWebDriver用于设置我们的测试将在哪个节点(或机器)上运行。