selenium grid Quick Starthtml
selenium-grid是用於設計幫助咱們進行分佈式測試的工具,其整個結構是由一個hub節點和若干個代理節點組成。hub用來管理各個代理節點的註冊和狀態信息,而且接受遠程客戶端代碼的請求調用,而後把請求的命令再轉發給代理節點來執行。java
一、啓動Selenium-Servernode
1)下載 selenium-server-standalone-*.jar,地址:http://selenium-release.storage.googleapis.com/index.html?path=2.41/web
2)啓動selenium server並註冊hub (假設hub服務器機器selenium-server版本爲2.41,本機IP爲192.32.50.26)chrome
到selenium-server-standalone-*.jar 包放置目錄下執行:java -jar selenium-server-standalone-2.41.0.jar -role hub -port 4441 (未指定port時,hub默認4444)api
3)本地或者遠程機器, 均可以啓動多個node瀏覽器
a.本地啓動:服務器
默認: java -jar selenium-server-standalone-2.41.0.jar -role node (默認的註冊地址:http://localhost:4444/grid/register,node默認端口:5555)多線程
指定hub: java -jar selenium-server-standalone-2.41.0.jar -role node -hub http://localhost:4441/grid/register分佈式
b.遠程啓動:
遠程一樣須要下載selenium-Server jar包,啓動以下: (假設遠程版本爲2.29)
java -jar selenium-server-standalone-2.29.0.jar -role node -hub http://192.32.50.26:4441/grid/register -Dwebdriver.chrome.driver=chromedriver29.exe -browser browserName=chrome -port 6666
二、具體應用
public class RemoteWebDriverDesiredCapTest { @Test public void myTest() throws MalformedURLException{ /** * 一、本地機器啓動了主節點hub (假設本臺機器IP:192.32.50.26,http://localhost:4444/grid/console 查看節點鏈接狀況) * java -jar selenium-server-standalone-2.41.0.jar -role hub (默認端口4444) * 二、本地也啓動了一個該hub 次節點A * java -jar selenium-server-standalone-2.41.0.jar -role node * (默認的註冊地址:http://localhost:4444/grid/register,node默認端口:5555) * (具體設置:java -jar selenium-server-standalone-2.41.0.jar -role node -port 5556 -hub http://localhost:4441/grid/register) * 三、本機器裝有firefox, chrome,因此經過該次節點A, 能夠用firefox來運行腳本, 也能夠用chrome * FF驅動默認在webDriver中了, 而chrome驅動須要本身指定, chromeDriver.exe ,運行chromeDriver(默認使用端口9515) */
//node:java -jar selenium-server-standalone-2.41.0.jar -role node DesiredCapabilities capability = DesiredCapabilities.firefox(); capability.setPlatform(Platform.VISTA); WebDriver driver = new RemoteWebDriver(new URL("http://192.32.50.26:5555/wd/hub"), capability); driver.get("http://www.baidu.com"); System.out.println(driver.getCurrentUrl()); driver.quit(); // node: 直接運行chromedriver.exe時, 經過http://xxx.xxx.xxx.xxx:9515 就能夠取得chrome; 或者像 下面指定-Dwebdriver.chrome.driver -port,形式 DesiredCapabilities aDesiredcap =new DesiredCapabilities("chrome","",Platform.VISTA); WebDriver wd = new RemoteWebDriver(new URL("http://localhost:9515"), aDesiredcap); wd.get("https://code.google.com/p/selenium/wiki/Grid2"); System.out.println(wd.getCurrentUrl()); wd.quit(); //node:java -jar selenium-server-standalone-2.41.0.jar -role node -hub http://192.32.50.26:4444/grid/register -Dwebdriver.ie.driver=IEDriverServer.exe -browser browserName=iexplore -port 7776 DesiredCapabilities iDesiredcap =new DesiredCapabilities("iexplore","",Platform.VISTA); WebDriver wdE = new RemoteWebDriver(new URL("http://192.32.50.26:7776/wd/hub"), iDesiredcap); wdE.get("https://code.google.com/p/selenium/wiki/Grid2"); System.out.println(wdE.getCurrentUrl()); wdE.quit(); //用另外一臺機器做爲次節點鏈接 , (假設IP為: 192.32.52.51 ) //java -jar selenium-server-standalone-2.29.0.jar -role node -hub http://192.32.50.26:4444/grid/register -Dwebdriver.chrome.driver=chromedriver29.exe -browser browserName=chrome -port 6666 DesiredCapabilities chrome =new DesiredCapabilities("chrome","",Platform.XP); WebDriver driverChrome = new RemoteWebDriver(new URL("http://192.32.52.51:6666/wd/hub"), chrome); driverChrome.get("http://www.cnblogs.com/"); driverChrome.quit(); } }
三、作成多線程方式
Selenium Grid只是提供多系統、多瀏覽器的執行環境,而不是說任務一個test case丟給它就能並行運行。並行的運行我這裏就交給testng了
以下代碼和配置:
1)testcase 代碼:
package com.jennifer.test; import java.net.MalformedURLException; import java.net.URL; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.remote.DesiredCapabilities; import org.openqa.selenium.remote.RemoteWebDriver; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Parameters; import org.testng.annotations.Test; public class GridParallelTests { private WebDriver dr; DesiredCapabilities desireCap; @Parameters({ "browser", "nodeUrl"}) @BeforeMethod public void setUp(String browser, String nodeUrl) { if (browser.equals("ie")){ desireCap = DesiredCapabilities.internetExplorer(); } else if (browser.equals("ff")) desireCap = DesiredCapabilities.firefox(); else if (browser.equals("chrome")) desireCap = DesiredCapabilities.chrome(); else System.out.println("browser parameter wrong , can only be :ie、 ff、chrome"); String url = nodeUrl + "/wd/hub"; URL urlInstance = null; try { urlInstance = new URL(url); } catch (MalformedURLException e) { e.printStackTrace(); } dr = new RemoteWebDriver(urlInstance, desireCap); } @Test public void test() { dr.get("http://www.baidu.com/"); dr.findElement(By.id("kw1")).sendKeys("selenium"); dr.findElement(By.id("su1")).click(); System.out.println("title:" + dr.getTitle()); } @AfterMethod public void quit() { dr.close(); } }
2)testng.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd"> <suite name="Suite1" parallel="tests" thread-count="5"> <test name="test1"> <parameter name="browser" value="ff" /> <parameter name="nodeUrl" value="http://192.32.50.26:5555"/> <classes> <class name="com.jennifer.test.GridParallelTests"></class> </classes> </test> <test name="test2"> <!-- java -jar selenium-server-standalone-2.41.0.jar -role node -hub http://192.32.50.26:4444/grid/register -Dwebdriver.chrome.driver=chromedriver29.exe -browser browserName=chrome -port 6666 --> <parameter name="browser" value="chrome" /> <parameter name="nodeUrl" value="http://192.32.50.26:6666" /> <classes> <class name="com.jennifer.test.GridParallelTests"></class> </classes> </test> <test name="test3"> <!-- java -jar selenium-server-standalone-2.41.0.jar -role node -hub http://192.32.50.26:4444/grid/register -Dwebdriver.ie.driver=IEDriverServer.exe -browser browserName=iexplore -port 7776 --> <parameter name="browser" value="ie" /> <parameter name="nodeUrl" value="http://192.32.50.26:7776" /> <classes> <class name="com.jennifer.test.GridParallelTests"></class> </classes> </test> </suite>