Selenium Grid是一种将测试分布在多个物理或虚拟机上的工具,以便我们可以并行(同时)执行脚本.它通过为我们提供快速准确的反馈,大大加快了跨浏览器和跨平台的测试过程.
Selenium Grid允许我们并行执行多个WebDriver或Selenium远程控制测试实例相同的代码库,因此代码不需要出现在他们执行的系统上. selenium-server-standalone软件包包括Hub,WebDriver和Selenium RC,用于在网格中执行脚本.
Selenium Grid有一个Hub和一个Node.
Hub : 集线器也可以理解为服务器,其充当将触发测试的中心点. Selenium Grid只有一个Hub,它在一台机器上启动一次.
Node : 节点是连接到Hub的Selenium实例,用于执行测试.网格中可以有一个或多个节点,可以是任何操作系统,可以包含任何Selenium支持的浏览器.
下图显示了Selenium Grid的体系结构.
为了使用网格,我们需要遵循某些协议.请听下面这个过程涉及的主要步骤 :
配置集线器
配置节点
开发脚本并准备XML文件
测试执行
结果分析
让我们详细讨论每个步骤.
第1步 : 从 http://docs.seleniumhq.org/download/下载最新的Selenium Server独立JAR文件.点击下面的版本下载它.
第2步 : 使用以下命令启动Selenium Server启动Hub.现在我们将使用端口'4444'启动集线器.
注意 : 确保没有其他应用程序在端口#4444上运行.
java -jar selenium-server-standalone-2.25.0.jar -port 4444 -role hub -nodeTimeout 1000
第3步 : 现在打开浏览器并从Hub(您执行步骤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 Server的位置独立的Jar文件(在节点机器上)
http://10.30.217.157:4444 =集线器的IP地址和4444是端口集线器
browserName = firefox(用于指定节点上浏览器名称的参数)
5555 = Firefox节点启动并运行的端口.
第3步 : 执行命令后,返回Hub.导航到URL - http://10.30.217.157:4444,Hub现在将显示附加到它的节点.
第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 Server独立Jar文件的位置(在节点机器上)
http ://10.30.217.157:4444 = Hub的IP地址,4444是Hub的端口
browserName = ie(要指定的参数)节点上的浏览器名称)
5558 = IE节点启动并运行的端口.
第7步 : 执行命令后,返回Hub.导航到URL - http://10.30.217.157:4444,Hub现在将显示附加到它的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 Server独立Jar文件的位置(在节点机器上)
http ://10.30.217.157:4444 =集线器的IP地址,4444是集线器的端口
browserName = chrome(要指定的参数)节点上的浏览器名称)
5557 = chrome节点所在的端口启动并运行.
步骤12 : 执行命令后,返回Hub.导航到URL - http://10.30.217.157:4444,Hub现在将显示附加到它的chrome节点.
步骤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步 : Browser参数将使用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步 : 现在打开Node,我们已经启动了所有浏览器节点.你会看到所有三个浏览器同时执行.
第1步 : 完成执行后,我们可以像任何其他执行一样分析结果.结果摘要将打印在控制台中,如以下快照所示.
第2步 : 导航到"运行套件的结果"选项卡,TestNG将显示结果摘要,如下所示.
第3步 : 生成HTML后,我们将能够以HTML格式查看测试结果.