應網友要求寫一個用Selenium Grid控制多系統多瀏覽器並行執行test case的例子。
因為我這里有兩台機子,我打算這樣演示:
一台機子啟動一個作為主點節的hub 和 一個作為次節點的hub(系統windows 瀏覽器為ie) ip為:192.168.40.24
另一台機子啟動兩個次節點hub,一個次節點瀏覽器為firefox,另一個瀏覽器為chrome (系統為windows),ip為:192.168.40.67
啟動各節點hub
啟動主節點hub命令:
java -jar selenium-server-standalone-2.24.1.jar -role hub
啟動與主節點同一機子的次節點hub命令:
java -jar selenium-server-standalone-2.24.1.jar -role node -hub http://localhost:4444/grid/register -browser browserName=”internet explorer”
啟動另外一台機子的兩個節點hub命令分別為:
- 啟動firefox的
java -jar selenium-server-standalone-2.24.1.jar -Dwebdriver.firefox.bin=”D:/Program Files/Mozilla Firefox/firefox.exe” -role webdriver -hub http://192.168.40.24:4444/grid/register -browser browserName=firefox
其中-Dwebdriver.firefox.bin=”D:/Program Files/Mozilla Firefox/firefox.exe”這個是傳我的firefox瀏覽器安裝地址,不然找不到。
- 啟動chrome的
java -jar selenium-server-standalone-2.24.1.jar -Dwebdriver.chrome.driver=”D:/chromedriver.exe” -role webdriver -hub http://192.168.40.24:4444/grid/register -port 6666 -browser browserName=chrome
其中-Dwebdriver.chrome.driver=”D:/chromedriver.exe”,這個是傳入我chromedriver.exe的放置地址。端口設為6666,防止和上面firefox的重復。
鏈接好后,可以在http://localhost:4444/grid/console可以查看到三個子節點的狀態。啟動詳細方法可以參考前面的文章。
Selenium Grid只是提供多系統、多瀏覽器的執行環境,而不是說任務一個test case丟給它就能並行運行。並行的運行我這里就交給testng了。看下面代碼和配制,應該很容易理解。
testcase 代碼 和 testng.xml
testcase代碼:
package driver; 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 test; String baseUrl; @Parameters({"browser","nodeUrl","webSite"}) @BeforeMethod public void setUp(String browser,String nodeUrl,String webSite){ baseUrl = webSite; if(browser.equals("ie")) test = DesiredCapabilities.internetExplorer(); else if(browser.equals("ff")) test = DesiredCapabilities.firefox(); else if(browser.equals("chrome")) test = DesiredCapabilities.chrome(); else System.out.println("browser參數有誤,只能為ie、 ff、chrome"); String url = nodeUrl + "/wd/hub"; URL urlInstance = null; try { urlInstance = new URL(url); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("實例化url出錯,檢查一下url格式是否正確,格式為:http://192.168.40.67:5555"); } dr = new RemoteWebDriver(urlInstance,test); dr.get(webSite); } @Test public void test(){ dr.get(baseUrl); dr.findElement(By.id("kw")).sendKeys("selenium"); dr.findElement(By.id("su")).click(); try { Thread.sleep(10000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("title:"+dr.getTitle()); } @AfterMethod public void quit(){ dr.close(); } }
testng.xml:
<!DOCTYPE suite SYSTEM "http://beust.com/testng/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.168.40.67:5555"/> <parameter name="webSite" value="http://www.baidu.com"/> <classes> <class name="driver.GridParallelTests"></class> </classes> </test> <test name="test2"> <parameter name="browser" value="chrome"/> <parameter name="nodeUrl" value="http://192.168.40.67:6666"/> <parameter name="webSite" value="http://www.baidu.com"/> <classes> <class name="driver.GridParallelTests"></class> </classes> </test> <test name="test3"> <parameter name="browser" value="ie"/> <parameter name="nodeUrl" value="http://192.168.40.24:5555"/> <parameter name="webSite" value="http://www.baidu.com"/> <classes> <class name="driver.GridParallelTests"></class> </classes> </test> </suite>
運行testng.xml就可以了。
如果你是用ant把上面的參數傳進去也是可以的。我這里就直接簡單地放在testng.xml了。