Selenium Grid 是 selenium 的三大组件之一,允许用户同时在不同的机器和系统上测试不同的浏览器,可以分布式的来执行我们的自动化测试,也可以测试不同浏览器的兼容性。
java -jar selenium-server-standalone-3.12.0.jar -role hub -port 18888 -maxSession 10
参数解释:
启动成功:
启动 chrome 浏览器:
java -Dwebdriver.chrome.driver="chromedriver.exe" -jar selenium-server-standalone-3.12.0.jar -role node -hub " http://192.168.1.104:18888/grid/register/" -port 18881 -browser "browserName=chrome,maxInstances=2,version=75,platform=WINDOWS"
参数解释:
启动成功:
通过地址: http://localhost:18888/grid/console
从控制台看到已经注册了一个 node 节点,使用的是 chrome 浏览器。
Selenium Grid 运行环境启动之后,我们通过对应的脚本来进行使用。
package com.ggf.webauto; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.BrowserType; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import java.net.URL; /** * @Description: * @Author: ggf * @Date: 2020/04/06 */ public class RemoteDemo { public static void main(String[] args) throws Exception { // 期望能力对象 DesiredCapabilities capabilities = new DesiredCapabilities(); //配置测试的浏览器,使用chrome浏览器 capabilities.setBrowserName(BrowserType.CHROME); // hub节点 String url = "http://192.168.1.104:18888/wd/hub"; //和hub建立通讯,把相应配置传给hub,hub会根据配置选择注册的node节点,打开相应的浏览器进行测试 WebDriver driver = new RemoteWebDriver(new URL(url), capabilities); driver.get("http://www.baidu.com"); driver.findElement(By.id("kw")).sendKeys("selenium"); Thread.sleep(2000); driver.quit(); } }
运行脚本之后,Selenium Grid 的 hub节点就会调用对应的 node 节点来执行我们脚本中的内容。
为了方便我们快速的启动 Selenium Grid , 我们可以将启动 hub 节点和 node 节点的命令写成一个 .bat 文件(windows系统) 或 shell 脚本(Linux系统)
以下是window系统的示例:
java -jar selenium-server-standalone-3.12.0.jar -role hub -port 18888 -maxSession 10
set command=java set chromeDriver=-Dwebdriver.chrome.driver="chromedriver.exe" set jarParams=-jar selenium-server-standalone-3.12.0.jar set type=-role node set hub=-hub "http://192.168.1.104:18888/grid/register" set port=-port 18881 set chrome=-browser "browserName=chrome,maxInstances=2,version=75,platform=WINDOWS" %command% %chromeDriver% %jarParams% %type% %hub% %port% %chrome%
Selenium Grid能够分布式在不同机器上运⾏不同浏览器,但是我们看到的串⾏的效果(也就是⼀个浏览器执⾏结束后,再运⾏另外⼀个浏览器)。要达到并发执⾏的效果,Selenium Grid是做不到的,我们需要通过TestNG单元测试框架所带的并发执⾏机制。并发执⾏能够带来的好处:
package com.ggf.webauto; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.BrowserType; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import org.testng.annotations.Test; import java.net.URL; /** * @Description: * @Author: ggf * @Date: 2020/04/06 */ public class SeleniumGridDemo { @Test public void testBaiduSearch() throws Exception{ // 期望能力对象 DesiredCapabilities capabilities = new DesiredCapabilities(); //配置测试的浏览器,使用chrome浏览器 capabilities.setBrowserName(BrowserType.CHROME); // hub节点 String url = "http://192.168.1.104:18888/wd/hub"; //和hub建立通讯,把相应配置传给hub,hub会根据配置选择注册的node节点,打开相应的浏览器进行测试 WebDriver driver = new RemoteWebDriver(new URL(url), capabilities); driver.get("http://www.baidu.com"); driver.findElement(By.id("kw")).sendKeys("selenium"); Thread.sleep(2000); driver.quit(); } }
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > <suite name="Suite" parallel="tests" thread-count="2"> <test name="Test1"> <classes> <class name="com.ggf.webauto.SeleniumGridDemo" /> </classes> </test> <test name="Test2"> <classes> <class name="com.ggf.webauto.SeleniumGridDemo" /> </classes> </test> </suite>
解释:
parallel="tests"
tests级别:不同的test tag下的用例可以在不同的线程下执行。
相同的test tag下的用例只能在同一个线程中去执行。
thread-count=2:代表了最大并发线程数.
以上xml配置表示:启动两个线程同时执行 SeleniumGridDemo 类。
testng多线程更多内容可参考文章:testng使用详解