1. 程式人生 > >Selenium-Grid2 配置RemoteWebDriver

Selenium-Grid2 配置RemoteWebDriver

tno 設備 driver one tty 兼容 images void 遠程

為什麽要使用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端口,默認端口是5555.
此處的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