介紹
網格允許你做的事情:
- 通過將測試分配到多臺機器上進行擴展(並行執行)
- 從一個控制點集中管理多個環境,這使得非常容易的將測試運行在廣闊的瀏覽器和操作系統組合上。
- 最小化網格的維護時間(允許實現自定義的鉤子,以便利用虛擬基礎設施)
快速指南
這個例子將告訴你如何開始Selenium2 Hub,並且註冊一個WebDriver節點和一個RC節點。我們也將向您展示如何從java中調用網格。在這個例子中,hub和節點運行在同一臺機器上,當然你也可以將selenium-server-standalone拷貝到多臺機器上。注意:selenium-server-standalone包包括運行網格所需要的Hub,WebDriver,和legacy RC。Ant不再是必要的。你可以從http://selenium-release.storage.googleapis.com/index.html下載selenium-server-standalone-*.jar包。在http://docs.seleniumhq.org/download/的SeleniumStandalone Server節點,目前版本爲3.4.0
第一步:啓動hub
Hub是接受全部測試請求的集中點,並將測試請求發發送到正確的節點。
打開cmd並進入到selenium-server-standalone文件所在的目錄,然後運行如下命令:java -jar selenium-server-standalone-<version>.jar -role hub
備註:在運行上述命令之前,需要先安裝java的jre環境。可以從http://www.oracle.com/technetwork/java/index.html下載。安裝完成後需要設置如下環境變量(windows):
變量名: JAVA_HOME
變量值: C:\ProgramFiles\Java\jdk1.7.0_45 \
變量名: PATH
變量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
變量名: CALSS_PATH
變量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
Hub默認使用4444端口啓動。如需要改變默認端口,在運行啓動命令的時候可以增加-port參數來指定你需要使用的端口。你可以在瀏覽器裏面打開http://localhost:4444/grid/console來查看hub的狀態信息。
第二步:啓動節點
不管是要使用WebDriver功能的網格還是RC功能的網格還是同事使用兩者,都是使用selenium-server-standalone 的jar文件來啓動節點。命令如下:
java -jarselenium-server-standalone-<version>.jar -role node -hub http://localhost:4444/grid/register
剛註冊的節點:
備註:節點的默認端口是55555
爲保持向後兼容, "wd"和"rc"角色依然是"node"角色的合法子集。但是這些角色限制了遠程連接到對應的API的連接類型,然而"node" 同事允許RC和WebDriver的練級。
使用網格來運行測試
現在網格已經準備好了,我們需要從測試用例中訪問網格,對於RC節點可以繼續使用DefaultSelenium對象並傳遞hub的信息給它。
Selenium selenium = newDefaultSelenium(“localhost”, 4444, “*firefox”, “http://www.google.com”);
對於WebDrive節點,需要使用RemoteWebDriver和DesiredCapabilities對象來定義你希望使用的瀏覽器、版本和平臺。
DesiredCapabilities capability= DesiredCapabilities.firefox();
將其傳入RemoteWebDriver對象:
WebDriver driver = newRemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
Hub將測試分配給匹配的節點。
如果節點匹配所有的請求能力,爲在網格上請求特定的能力,需要在傳送給WebDriver之前指定這些請求的能力。
capability.setBrowserName();
capability.setPlatform();
capability.setVersion()
capability.setCapability(,);
例子:一個設置如下的節點:
-browser browserName=firefox,version=3.6,platform=LINUX
將匹配:
capability.setBrowserName(“firefox”);
capability.setPlatform(“LINUX”);
capability.setVersion(“3.6”);
也匹配
capability.setBrowserName(“firefox”);
capability.setVersion(“3.6”);
沒有指定的能力將被忽略。如果你指定的能力在網格中不存在(如Firefox的版本爲4.0但是沒有Firefox的實例),那麼就不會進行匹配且測試運行失敗。
配置節點
配置節點的方式有兩種;一種方式是通過命令行參數來指定,另外一種是通過json文件來指定。
通過命令行參數配置節點
啓動節點是,默認可以併發使用11個瀏覽器;5個FireFox,5個Chrome,1個InternetExplorer。最大的併發測試數量是5。爲改變瀏覽器設置,通過-browser開關指定參數(每一個開關代表一個節點)。如果你使用-browser參數,默認瀏覽器將被忽略並且只有你指定的命令行將被使用。
-browserbrowserName=firefox,version=3.6,maxInstances=5,platform=LINUX
這個設置是在linux機器上啓動5個3.6版本的FirFox節點。
如果在遠程機器上有多個需要使用的FireFox版本,可以通過路徑來指定特定的版本:
-browserbrowserName=firefox,version=3.6,firefox_binary=/home/myhomedir/firefox36/firefox,maxInstances=3,platform=LINUX-browserbrowserName=firefox,version=4,firefox_binary=/home/myhomedir/firefox4/firefox,maxInstances=4,platform=LINUX
提示:如果你提供的參數有空格,使用雙引號括起來:
-browser“browserName=firefox,version=3.6,firefox_binary=c:\Program Files\firefox,maxInstances=3, platform=WINDOWS”
可選參數
- -port 4444 (4444是默認端口號)
- -host <IP | hostname> 指定主機名或IP地址,通常這個是沒有必要的且這個是自動確定的。對於外部網絡配置(如VPN)指定主機可能是必須的。
- -timeout 30 (300秒是默認值)hub自動釋放節點的超時毫秒數(沒有收到任何請求)。在這個時間之後節點將被釋放用於隊列中的其他測試。這個清除客戶端崩潰而不用手工介入。如果timeout的參數爲0,將永遠不會超時,hub永遠不會釋放節點。
注意:這個不是WebDriver的超時設置。(”wait for WebElement”類型命令)
- -maxSession 5 (5是默認值) 在節點上可以併發運行的瀏覽器數量。這個與支持的瀏覽器的maxInstance 不同(例如:一個支持Firefox 3.6, Firefox 4.0 and Internet Explorer 8的節點,maxSession=1將只會有一個瀏覽器運行,maxSession=2可以同時運行兩個FireFox瀏覽器或者1個FireFox和1個Internet Explorer瀏覽器)。
- -browser < params > 如果 –browser參數沒有設置,啓動的節點將具有5 firefox, 1 chrome, and 1 internet explorer實例 (在Windows平臺上). 這個參數可以在同一行設置多次,如:-browser: browserName={android, chrome, firefox, htmlunit, internet explorer, iphone, opera} version={browser version} firefox_binary={path to executable binary} chrome_binary={path to executable binary} maxInstances={maximum number of browsers of this type} platform={WINDOWS, LINUX, MAC}
- -registerCycle N = 在多少毫秒之後節點重新註冊自己。這個允許重啓hub而不用重啓節點。
- 對於大容量的hub安裝(超過50個節點),需要在java命令行增加jetty的線程數量-DPOOL_MAX=512 (or larger)
配置超時(2.21版本需要)
網格的超時通過webDriver.manage().timeouts()來處理,這個允許控制不同操作的超時。
爲保持具有selenium-server網格的運行時完整性,有兩個其他的超時值可以設置。
在hub上,使用-timeout選項設置30秒超時,這將確保在客戶端崩潰後所有資源在30秒內被回收。通過-browserTimeout 60設置一個節點被瀏覽器掛起的最大時間。所有的節點都是用來自於hub設置的這兩個值。一般建議不要在單獨的節點上設置這些超時。
browserTimeout的設置應該是:
- 高於套接字鎖定超時(45秒)
- 一般來說也要高於webDriver.manage().timeouts()設置的值, 因爲這個是最後的防禦機制。
用JSON配置節點
java -jar selenium-server-standalone.jar -rolenode -nodeConfig nodeconfig.json
3.x.x (>= beta4) 的配置可以參考 https://github.com/SeleniumHQ/selenium/blob/master/java/server/src/org/openqa/grid/common/defaults/DefaultNodeWebDriver.json
如下:
{ |
"capabilities": |
[ |
{ |
"browserName": "firefox", |
"maxInstances": 5, |
"seleniumProtocol": "WebDriver" |
}, |
{ |
"browserName": "chrome", |
"maxInstances": 5, |
"seleniumProtocol": "WebDriver" |
}, |
{ |
"browserName": "internet explorer", |
"maxInstances": 1, |
"seleniumProtocol": "WebDriver" |
} |
], |
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", |
"maxSession": 5, |
"port": 5555, |
"register": true, |
"registerCycle": 5000, |
"hub": "http://localhost:4444", |
"nodeStatusCheckTimeout": 5000, |
"nodePolling": 5000, |
"role": "node", |
"unregisterIfStillDownAfter": 60000, |
"downPollingLimit": 2, |
"debug": false, |
"servlets" : [], |
"withoutServlets": [], |
"custom": {} |
} |
2.x.x 版本的配置可以參考https://github.com/SeleniumHQ/selenium/blob/selenium-2.53.0/java/server/src/org/openqa/grid/common/defaults/DefaultNode.json
{ |
"capabilities": |
[ |
{ |
"browserName": "*firefox", |
"maxInstances": 5, |
"seleniumProtocol": "Selenium" |
}, |
{ |
"browserName": "*googlechrome", |
"maxInstances": 5, |
"seleniumProtocol": "Selenium" |
}, |
{ |
"browserName": "*iexplore", |
"maxInstances": 1, |
"seleniumProtocol": "Selenium" |
}, |
{ |
"browserName": "firefox", |
"maxInstances": 5, |
"seleniumProtocol": "WebDriver" |
}, |
{ |
"browserName": "chrome", |
"maxInstances": 5, |
"seleniumProtocol": "WebDriver" |
}, |
{ |
"browserName": "internet explorer", |
"maxInstances": 1, |
"seleniumProtocol": "WebDriver" |
} |
], |
"configuration": |
{ |
"proxy": "org.openqa.grid.selenium.proxy.DefaultRemoteProxy", |
"maxSession": 5, |
"port": 5555, |
"host": ip, |
"register": true, |
"registerCycle": 5000, |
"hubPort": 4444, |
"hubHost": ip |
} |
} |
注意:在2.x.x裏面的configuration{ ... }對象在3.x.x裏面已經被取消。
用JSON配置hub
java -jar selenium-server-standalone.jar -rolehub -hubConfig hubconfig.json
hubconfig.json 配置內容請參考: https://github.com/SeleniumHQ/selenium/blob/master/java/server/src/org/openqa/grid/common/defaults/DefaultHub.json
Hub的診斷消息
當檢測到異常使用模式時,hub會給出如下的消息:
Client requested session XYZthat was terminated due to REASON
原因 |
起因/修復 |
TIMEOUT |
會話超時,因爲客戶端在規定的超時時間裏沒有訪問它。如果客戶端已經被暫停執行就可能發生。 |
BROWSER_TIMEOUT |
節點瀏覽器超時,因其被掛起太長的時間。 (參數 browserTimeout) |
ORPHAN |
在隊列中等待的客戶端放棄了,因其被賦予了新的會話。 |
CLIENT_STOPPED_SESSION |
客戶端調用stop/quit終止了會話。爲什麼又在使用呢???? |
CLIENT_GONE |
客戶端進程已經死機或者對請求沒有迴應,不穩定的網絡也可能導致這個問題。 |
FORWARDING_TO_NODE_FAILED |
Hub不能轉發給節點。內存不足、節點穩定性問題或網絡問題 |
CREATIONFAILED |
節點創建瀏覽器失敗。主要是節點環境或配置問題。嘗試直接使用節點來跟蹤問題。 |
PROXY_REREGISTRATION |
會話被丟棄,因爲節點重新註冊到了網格。 |
使用網格要點:
如果你的測試是併發運行的,請確保每一個線程有獨佔的webdriver資源。在線程開始運行的時候每個線程分配一個瀏覽器然後在線程結束的時候釋放所有的瀏覽器,這並不是一個好的注意。(因爲如果一個測試用例花費了太多的時間,可能導致剩餘的測試超時,因爲都在等待這個慢的測試。這個會令人感到迷惑)