應網友要求寫一個用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了。
