Selenium-Grid2 配置RemoteWebDriver
為什麽要使用Selenium Grid ?
- 分布式運行大規模的Test
- 能夠通過一個中央點,很容易的運行不同OS上的不同browser
- 最小化對Grid的維護時間,並能充分利用虛擬設備
Selenium Grid 部署與啟動
Hub :總控節點,連接調用Node。
Node: 負責執行Tests,調用瀏覽器。
下面以selenium-server-standalone-2.27.0.jar版本為例:
使用這樣3臺機器:
- 10.81.14.170
- 10.81.14.180
- 10.81.14.190
啟動Hub(10.81.14.180):
java -jar selenium-server-standalone-2.27.0.jar -role hub
在瀏覽器內打開:http://10.81.14.180:4444/grid/console可以查看Hub狀態。也就是說Grid默認啟動端口是4444,如果想切換為其他端口,則加-port
參數。比如要切換為8888:
java -jar selenium-server-standalone-2.27.0.jar -role hub -port 8888
啟動Node(10.81.14.170):
java -jar selenium-server-standalone-2.27.0.jar -role node -hub http://10.81.14.180:8888/grid/register
同樣的,也可以使用-port
此處的node節點,也可以作為一個單機的遠程節點存在,並同時支持RC,WebDriver。瀏覽器輸入http://10.81.14.180:8877/wd/hub可以看到session信息。
然後,同樣的啟動10.81.14.180、10.81.14.190上的Node節點。
打開瀏覽器http://10.81.14.180:8888/grid/console,可以看到如下的界面:
至此,Selenium Grid2已經配置成功了。
使用Grid運行Tests
Selenium Grid2是向後兼容的,同時支持RC,WebDriver。如果使用RC,即Selenium1,使用以下的方法:
Selenium selenium = new DefaultSelenium(“10.81.14.180”, 8888, “*firefox”, “http://www.baidu.com”);
使用WebDriver的話,使用以下的方法:
DesiredCapabilities capability = DesiredCapabilities.firefox();
WebDriver driver = new RemoteWebDriver(new URL("http://10.81.14.180:8888/wd/hub"), capability);
可以看出所有的請求都發給了Hub,然後由Hub分配給匹配的節點來執行。
那麽,Hub是如何來分配的呢?往下看
Node配置
默認,Node會啟動11個瀏覽器實例:5 Firefox,5 Chrome, 1 Internet Explorer. 從Grid Console界面看出來,為什麽每個機器上有22個實例呢?是這樣的,Node為了同時支持RC與WebDriver兩種協議,所以就是2*11了。把鼠標放到各個瀏覽器圖標上,就可以看出裏面的配置區別了。
內容類似:
{
"browserName": "*firefox",
"maxInstances": 5,
"seleniumProtocol": "Selenium"
}
或者
{
"browserName": "firefox",
"maxInstances": 5,
"seleniumProtocol": "WebDriver"
}
其中,seleniumProtocol就是定義的不同協議了。
如何修改Driver配置呢?可以從啟動參數裏操作。
-browser browserName=firefox,version=3.6,maxInstances=5,platform=LINUX
那Node默認啟動的配置是什麽呢?
由於如果從啟動參數裏,配置這個多東西,很難寫的。因此,官方很人性化的提供了JSON文件來配置。也就是說默認啟動的配置如下:
http://code.google.com/p/selenium/source/browse/trunk/java/server/src/org/openqa/grid/common/defaults/DefaultNode.json
http://code.google.com/p/selenium/source/browse/trunk/java/server/src/org/openqa/grid/common/defaults/DefaultHub.json
如果想自定義配置,直接對json文件修改,啟動時,指定配置文件就可以了。
java -jar selenium-server-standalone.jar -role hub -hubConfig hubconfig.json
僅僅就這樣就行了?從博文http://www.shenyanchao.cn/blog/2012/10/12/selenium-multiple-browser-support/知道,瀏覽器的啟動是要制定一些driver位置的,否則Node不知道怎麽啟動瀏覽器實例。因此需要進行指定:
java -jar selenium-server-standalone-2.27.0.jar -port 8877 -role node -hub http://10.81.14.180:8888/grid/register -nodeConfig nodeconfig.json -Dwebdriver.chrome.driver="E:/selenium/chromedriver.exe" -Dwebdriver.ie.driver="E:/selenium/IEDriverServer.exe"
參考文檔:
http://code.google.com/p/selenium/wiki/Grid2
客戶端書寫測試用例
package seleniumdemo;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
public class EDemo2 {
public static void main(String[] args) throws MalformedURLException, InterruptedException {
// RemoteWebDriver的基本使用
//第一個參數:表示服務器的地址。第二個參數:表示預期的執行對象,其他的瀏覽器都可以以此類推
WebDriver driver = new RemoteWebDriver(new URL("http://127.0.0.1:4444/wd/hub/"), DesiredCapabilities.chrome());
driver.manage().window().maximize();
driver.get("http://www.baidu.com");
Thread.sleep(2000);
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("alert(‘我現在在服務器‘)");
Thread.sleep(2000);
driver.quit();
}
}
執行腳本
其實腳本是在服務器端執行的,客戶端用於發送命令。執行過程中可以看到服務器端的chrome別調用,同時cmd打印出相關的運行信息,如下
Selenium-Grid2 配置RemoteWebDriver