Selenium - 网格
Selenium Grid 是一个将测试分布在多个物理机或虚拟机上的工具,以便我们可以并行(同时)执行脚本。它为我们提供快速、准确的反馈,极大地加快了跨浏览器和跨平台的测试过程。
Selenium Grid 允许我们并行执行 WebDriver 或 Selenium Remote Control 测试的多个实例,这些测试使用相同的代码库,因此代码不需要出现在它们执行的系统上。selenium-server-standalone 包包括 Hub、WebDriver 和 Selenium RC,用于在网格中执行脚本。
Selenium Grid 有一个集线器和一个节点。
集线器- 集线器也可以理解为服务器,充当触发测试的中心点。Selenium Grid 只有一个 Hub,并且在一台机器上启动一次。
节点- 节点是附加到执行测试的集线器的 Selenium 实例。网格中可以有一个或多个节点,这些节点可以是任何操作系统,并且可以包含任何 Selenium 支持的浏览器。
建筑学
下图展示了 Selenium Grid 的架构。
使用网格
为了与网格合作,我们需要遵循某些协议。下面是这个过程中涉及的主要步骤 -
- 配置集线器
- 配置节点
- 开发脚本并准备 XML 文件
- 测试执行
- 结果分析
让我们详细讨论每个步骤。
配置集线器
步骤 1 - 从http://docs.seleniumhq.org/download/下载最新的 Selenium Server 独立 JAR 文件。单击版本即可下载,如下所示。
步骤 2 - 使用以下命令启动 Selenium 服务器来启动 Hub。现在我们将使用端口“4444”来启动集线器。
注意- 确保没有其他应用程序在端口# 4444 上运行。
java -jar selenium-server-standalone-2.25.0.jar -port 4444 -role hub -nodeTimeout 1000
步骤 3 - 现在打开浏览器并从集线器(您执行步骤#2 的系统)导航到 URL http://localhost:4444。
步骤 4 - 现在单击“控制台”链接,然后单击“查看配置”。集线器的配置将显示如下。截至目前,我们还没有任何节点,因此我们无法看到详细信息。
配置节点
步骤 1 - 登录到节点(您要执行脚本的位置)并将“selenium-server-standalone-2.42.2”放入文件夹中。我们需要在启动节点时指向 selenium-server-standalone JAR。
步骤 2 - 使用以下命令启动 FireFox 节点。
java -jar D:\JAR\selenium-server-standalone-2.42.2.jar -role node -hub http://10.30.217.157:4444/grid/register -browser browserName = firefox -port 5555
在哪里,
D:\JAR\selenium-server-standalone-2.42.2.jar = Selenium 服务器独立 Jar 文件的位置(在节点计算机上)
http://10.30.217.157:4444 = 集线器的 IP 地址,4444 是集线器的端口
browserName = firefox(用于指定节点上的浏览器名称的参数)
5555 = Firefox 节点启动并运行的端口。
步骤 3 - 执行命令后,返回集线器。导航到 URL - http://10.30.217.157:4444,集线器现在将显示附加到它的节点。
步骤 4 - 现在让我们启动 Internet Explorer 节点。为了启动 IE 节点,我们需要在节点计算机上下载 Internet Explorer 驱动程序。
步骤 5 - 要下载 Internet Explorer 驱动程序,请导航至http://docs.seleniumhq.org/download/并根据操作系统的体系结构下载适当的文件。下载后,解压 exe 文件并将其放入启动 IE 节点时必须引用的文件夹中。
步骤 6 - 使用以下命令启动 IE。
C:\>java -Dwebdriver.ie.driver = D:\IEDriverServer.exe -jar D:\JAR\selenium-server-standalone-2.42.2.jar -role webdriver -hub http://10.30.217.157:4444/grid/register -browser browserName = ie,platform = WINDOWS -port 5558
在哪里,
D:\IEDriverServer.exe = 下载的 IE 驱动程序的位置(在节点计算机上)
D:\JAR\selenium-server-standalone-2.42.2.jar = Selenium 服务器独立 Jar 文件的位置(在节点计算机上)
http://10.30.217.157:4444 = 集线器的 IP 地址,4444 是集线器的端口
browserName = ie(指定节点上浏览器名称的参数)
5558 = IE 节点启动并运行的端口。
步骤 7 - 执行命令后,返回集线器。导航到 URL - http://10.30.217.157:4444,集线器现在将显示附加到它的 IE 节点。
步骤 8 - 现在让我们启动 Chrome Node。为了启动 Chrome 节点,我们需要在节点计算机上下载 Chrome 驱动程序。
步骤 9 - 要下载 Chrome 驱动程序,请导航至http://docs.seleniumhq.org/download/,然后导航至第三方浏览器驱动程序区域并单击版本号“2.10”,如下所示。
步骤 10 - 根据您的操作系统类型下载驱动程序。我们将在Windows环境下执行它,因此我们将下载Windows Chrome驱动程序。下载后,解压 exe 文件并将其放置在启动 chrome 节点时必须引用的文件夹中。
步骤 11 - 使用以下命令启动 Chrome。
C:\>java -Dwebdriver.chrome.driver = D:\chromedriver.exe -jar D:\JAR\selenium-server-standalone-2.42.2.jar -role webdriver -hub http://10.30.217.157:4444/grid/register -browser browserName = chrome, platform = WINDOWS -port 5557
在哪里,
D:\chromedriver.exe = 下载的 chrome 驱动程序的位置(在节点计算机上)
D:\JAR\selenium-server-standalone-2.42.2.jar = Selenium 服务器独立 Jar 文件的位置(在节点计算机上)
http://10.30.217.157:4444 = 集线器的 IP 地址,4444 是集线器的端口
browserName = chrome(指定节点上浏览器名称的参数)
5557 = chrome 节点启动并运行的端口。
步骤 12 - 执行命令后,返回集线器。导航到 URL - http://10.30.217.157:4444,Hub 现在将显示附加到它的 chrome 节点。
开发脚本并准备 XML 文件
步骤 1 - 我们将使用 TestNG 开发测试。在下面的示例中,我们将使用远程 webDriver 启动每一个浏览器。它可以将它们的功能传递给驱动程序,以便驱动程序拥有在节点上执行的所有信息。
浏览器参数将从“XML”文件传递。
package TestNG;
import org.openqa.selenium.*;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Parameters;
import org.testng.annotations.Test;
import java.net.URL;
import java.util.concurrent.TimeUnit;
import java.net.MalformedURLException;
public class TestNGClass {
public WebDriver driver;
public String URL, Node;
protected ThreadLocal<RemoteWebDriver> threadDriver = null;
@Parameters("browser")
@BeforeTest
public void launchapp(String browser) throws MalformedURLException {
String URL = "http://www.calculator.net";
if (browser.equalsIgnoreCase("firefox")) {
System.out.println(" Executing on FireFox");
String Node = "http://10.112.66.52:5555/wd/hub";
DesiredCapabilities cap = DesiredCapabilities.firefox();
cap.setBrowserName("firefox");
driver = new RemoteWebDriver(new URL(Node), cap);
// Puts an Implicit wait, Will wait for 10 seconds before throwing exception
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
// Launch website
driver.navigate().to(URL);
driver.manage().window().maximize();
} else if (browser.equalsIgnoreCase("chrome")) {
System.out.println(" Executing on CHROME");
DesiredCapabilities cap = DesiredCapabilities.chrome();
cap.setBrowserName("chrome");
String Node = "http://10.112.66.52:5557/wd/hub";
driver = new RemoteWebDriver(new URL(Node), cap);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
// Launch website
driver.navigate().to(URL);
driver.manage().window().maximize();
} else if (browser.equalsIgnoreCase("ie")) {
System.out.println(" Executing on IE");
DesiredCapabilities cap = DesiredCapabilities.chrome();
cap.setBrowserName("ie");
String Node = "http://10.112.66.52:5558/wd/hub";
driver = new RemoteWebDriver(new URL(Node), cap);
driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
// Launch website
driver.navigate().to(URL);
driver.manage().window().maximize();
} else {
throw new IllegalArgumentException("The Browser Type is Undefined");
}
}
@Test
public void calculatepercent() {
// Click on Math Calculators
driver.findElement(By.xpath(".//*[@id = 'menu']/div[3]/a")).click();
// Click on Percent Calculators
driver.findElement(By.xpath(".//*[@id = 'menu']/div[4]/div[3]/a")).click();
// Enter value 10 in the first number of the percent Calculator
driver.findElement(By.id("cpar1")).sendKeys("10");
// Enter value 50 in the second number of the percent Calculator
driver.findElement(By.id("cpar2")).sendKeys("50");
// Click Calculate Button
// driver.findElement(By.xpath(".//*[@id = 'content']/table/tbody/tr/td[2]/input")).click();
// Get the Result Text based on its xpath
String result =
driver.findElement(By.xpath(".//*[@id = 'content']/p[2]/span/font/b")).getText();
// Print a Log In message to the screen
System.out.println(" The Result is " + result);
if(result.equals("5")) {
System.out.println(" The Result is Pass");
} else {
System.out.println(" The Result is Fail");
}
}
@AfterTest
public void closeBrowser() {
driver.quit();
}
}
步骤 2 - 将使用 XML 传递浏览器参数。在项目文件夹下创建一个 XML。
步骤 3 - 从“常规”中选择“文件”,然后单击“下一步”。
步骤 4 - 输入文件名,然后单击“完成”。
步骤 5 - 在项目文件夹下创建 TestNg.XML,如下所示。
步骤 6 - XML 文件的内容如下所示。我们创建 3 个测试并将它们放在一个套件中并提及parallel="tests",以便所有测试都将并行执行。
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name = "Suite" parallel = "tests">
<test name = "FirefoxTest">
<parameter name = "browser" value = "firefox" />
<classes>
<class name = "TestNG.TestNGClass" />
</classes>
</test>
<test name = "ChromeTest">
<parameter name = "browser" value = "chrome" />
<classes>
<class name = "TestNG.TestNGClass" />
</classes>
</test>
<test name = "IETest">
<parameter name = "browser" value = "ie" />
<classes>
<class name = "TestNG.TestNGClass" />
</classes>
</test>
</suite>
测试执行
步骤 1 - 选择创建的 XML;右键单击并选择“运行方式”>>“TestNG Suite”。
步骤 2 - 现在打开节点,我们在其中启动了所有浏览器节点。您将看到所有三个浏览器同时执行。
结果分析
步骤 1 - 完成执行后,我们可以像任何其他执行一样分析结果。结果摘要打印在控制台中,如以下快照所示。
步骤 2 - 导航到“运行套件的结果”选项卡,TestNG 将显示结果摘要,如下所示。
步骤 3 - 生成 HTML 后,我们将能够看到 HTML 格式的测试结果。

