# Selenium Grid
## 快速上手
如果你對 Selenium 自動化測試已經非常熟悉,你僅僅需要一個快速上手來使程序運行起來。本章節的內容能滿足不同的技術層次,但是如果你僅僅需要一個可以快速上手的指引,那么就顯得有點多。如果是這樣,你可以參考 [Selenium Wiki](http://code.google.com/p/selenium/wiki/Grid2) 的相關文章。
## 什么是 Selenium-Grid ?
Selenium-Grid 允許你在多臺機器的多個瀏覽器上并行的進行測試,也就是說,你可以同時運行多個測試。本質上來說就是,Selenium-Grid 支持分布式的測試執行。它可以讓你的測試在一個分布式的執行環境中運行。
## 何時需要使用
通常,以下兩種情況你都會需要使用 Selenium-Grid。
- 在多個瀏覽器中運行測試,在多個版本的瀏覽器中進行測試,或在不同操作系統的瀏覽器中進行測試。
- 減少測試運行時間。
Selenium-Grid 通過使用多臺機器并行地運行測試來加速測試的執行過程。例如,如果你有一個包含100個測試用例的測試套件,你使用 Selenium-Grid 支持4臺不同的機器(虛擬機或實體機均可)來運行那些測試,同僅使用一臺機器相比,你的測試所需要的運行時間大致為其 1/4。對于大型的測試套件和那些會進行大量數據校驗的需要長時間運行的測試套件來說,這將節約很多時間。有些測試套件可能要運行好幾小時。另一個需要縮短套件運行時間的原因是開發者檢入(check-in)AUT 代碼后,需要縮短測試的運行周期。越來越多的團隊使用敏捷開發,相比整夜整夜的等待測試通過,他們希望盡快地看到測試反饋。
Selenium-Grid 也可以用于支持多執行環境的測試運行,典型的,同時在多個不同的瀏覽器中運行。例如,Grid 的虛擬機可以安裝測試必須的各種瀏覽器。于是,機器 1 上有 ie8,機器 2 上有 ie9,機器 3 上有最新版的 chrome,而機器 4 上有最新版的 firefox。當測試套件運行時,Selenium-Grid 可以使測試在指定的瀏覽器中運行,并且接收每個瀏覽器的運行結果。
另外,我們可以擁有一個裝有多個類型和版本都一樣的瀏覽器 Grid。例如,一個 Grid 擁有 4 臺機器,每臺機器可以運行 3 個 firefox 12 實例,形成一個 firefox 的服務農場。當測試套件運行時,每個傳遞給 Selenium-Grid 的測試都被指派給下一個可用的 firefox 實例。通過這種方式,我們可以使得同時有 12 個測試在并行的運行以完成測試,顯著地縮短了測試完成需要的時間。
Selenium-Grid 非常靈活。以上兩個例子可以聯合起來使用,這樣可以就可以使得不同類型和版本的瀏覽器有多個可運行實例。使用這樣的配置,既并行地執行測試,同時又可以測試多個瀏覽器類型和版本。
## Selenium-Grid 2.0
Selenium-Grid 2.0 是在編寫本文時(5/26/2012)已發布的最新版本。它同版本 1 有很多不同之處。在 2.0 中,Selenium-Grid 和 Selenium-RC 服務端進行了合并。現在,你僅需要下載一個 jar 包就可以獲得它們。
## Selenium-Grid 1.0
版本 1 是 Selenium-Grid 的第一個發布版本。如果你是一個 Selenium-Grid 新手,你應該選擇版本 2 。新版本已經在原有基礎上進行了更新,頁增加了一些新特性,并且支持 Selenium-WebDriver。一些老的系統可能仍然在使用版本 1.關于 Selenium-Grid 版本 1 的信息可以參考 [Selenium-Grid website](http://selenium-grid.seleniumhq.org/)
## Selenium-Grid 的 Hub 和 Nodes 是如何工作的?
Grid 由一個中心和一到多個節點組成。兩者都是通過 selenium-server.jar 啟動。在接下來的章節中,我們列出了一些例子。
中心接收要執行的測試信息,包括在哪些平臺和瀏覽器執行等。它知道每個注冊了的節點的配置。根據測試信息,它會選擇符合需求的節點進行測試。一旦選定了一個節點,測試腳本就會初始化 Selenium 命令,并且由重心發送給選定的要運行測試的節點。這個節點會啟動瀏覽器,然后在瀏覽器中執行這個 AUT 的 Selenium 命令。
我們提供了一些[圖標](http://selenium-grid.seleniumhq.org/how_it_works.html)來演示其原理。第二張圖標是用以說明 Selenium-Grid 1 的,版本 2 也適用并且對于我們的描述是一個很好的說明。唯一的區別在于相關術語。使用“Selenium-Grid 節點”替換“Selenium Remote Control”即符合我們對 Selenium-Grid 2 的描述。
## 下載
下載過程很簡單。從 SeleniumHq 站點的[下載頁面](http://docs.seleniumhq.org/download/)下載 Selenium-Server jar 包。你需要的鏈接在“Selenium-Server (以前是 Selenium-RC)”章節中。
將它存放到任意文件夾中。你需要確保機器上正確的安裝了 java。如果 java 沒有正常運行,檢查你系統的 path 變量是否包含了 java.exe 的路徑。
## 啟動 Selenium-Grid
由于節點對中心有依賴,所以你通常需要先啟動一個中心。這也不是必須的,因為節點可以識別其中心是否已經啟動,反之亦然。作為教程,我們建議你先啟動中心,否則會顯示一些錯誤信息,你應該不會想在第一次使用 Selenium-Grid 的時候就看到它們。
### 啟動中心
通過在命令行執行以下命令,可以啟動一個使用默認設置的中心。所有平臺可用,包括 Windows Linux, 或 MacOs 。
java -jar selenium-server-standalone-2.21.0.jar -role hub
我們將在接下來的章節中解釋各個參數。注意,你可能需要修改上述命令中 jar 包的版本號,這取決于你使用的 selenium-server 的版本。
### 啟動節點
通過在命令行執行以下命令,可以你懂一個使用默認設置的節點。
java -jar selenium-server-standalone-2.21.0.jar -role node -hub http://localhost:4444/grid/register
該操作假設中心是使用默認設置啟動的。中心用于監聽請求使用的默認端口號為 4444,這就是為什么端口 4444 被用于中心 url 中。同時“localhost”假定你的節點和中心運行在同一臺機器上。對于新手來說,這是最簡單的方式。如果要在兩臺不同的機器上運行中心和節點,只需要將“localhost”替換成中心所在機器的 hostname 即可。
**警告:** 確保運行中心和節點的機器均已關閉防火墻,否則你將看到一個連接錯誤。
## 配置 Selenium-Grid
### 默認配置
### JSON 配置文件
### 通過命令行選項配置
## 中心配置
通過指定 `-role hub` 即以默認設置啟動中心:
java -jar selenium-server-standalone-2.21.0.jar -role hub
你將看到以下日志輸出:
Jul 19, 2012 10:46:21 AM org.openqa.grid.selenium.GridLauncher main
INFO: Launching a selenium grid server
2012-07-19 10:46:25.082:INFO:osjs.Server:jetty-7.x.y-SNAPSHOT
2012-07-19 10:46:25.151:INFO:osjsh.ContextHandler:started o.s.j.s.ServletContextHandler{/,null}
2012-07-19 10:46:25.185:INFO:osjs.AbstractConnector:Started SocketConnector@0.0.0.0:4444
### 指定端口
中心默認使用的端口是 4444 。這是一個 TCP/IP 端口,被用于監聽客戶端,即自動化測試腳本到 Selenium-Grid 中心的連接。如果你電腦上的另一個應用已經占用這個接口,或者你已經啟動了一個 Selenium-Server,你將看到以下輸出:
10:56:35.490 WARN - Failed to start: SocketListener0@0.0.0.0:4444
Exception in thread "main" java.net.BindException: Selenium is already running on port 4444. Or some other service is.
如果看到這個信息,你可以關掉在使用端口 4444 的進程,或者告訴 Selenium-Grid 使用一個別的端口來啟動中心。`-port` 選項用于修改中心的端口:
java -jar selenium-server-standalone-2.21.0.jar -role hub -port 4441
即使已經有一個中心運行在這臺機器上,只要它們不使用同一個端口,就能正常工作。
你可能想知道哪個進程使用了 4444 端口,這樣你就可以讓中心使用這個默認端口。使用以下命令可以查看你機器上所有運行程序使用的端口:
netstat -a
Unix/Linux, MacOs 和 Windows 均支持此命令,只是在 Windows 中 -a 參數為必須的。基本上,你需要顯示進程 id 和端口。在 Unix 中,你可以通過管道 “grep” 輸出那些你關心的端口相關的條目。
## 節點配置
## 時間參數
## 獲取命令行幫助
Selenium-Server 提供了一個可選項列表,每個選項都有一個簡短的描述。目前(2012夏),命令行幫助還有一些奇怪,但是如果你知道如何去找、如何解讀信息會對你很有幫助。
Selenium-Server 提供了兩種不同的功能,Selenium-RC server 和 Selenium-Grid。它們是兩個不同的團隊編寫的,所以每個功能的命令行幫助被放置在不同的地方。因此,對于新手來說,在初次使用任意一個功能時,幫助都不是那么顯而易見。
如果你僅傳遞一個 `-h` 選項,你將看到 Selenium-RC Server 的可選項而不是 Selenium-Grid 的。
java -jar selenium-server-standalone-2.21.0.jar -h
上述代碼將顯示 Selenium-RC server 選項。如果你想看到 Selenium-Grid 的命令行幫助,你需要先使用 `-hub` 或 `-node` 選項告訴 Selenium-Server 你想看的是關于 Selenium-Grid 的,然后再追加 `-h` 選項。
java -jar selenium-server-standalone-2.21.0.jar -role node -h
對于這個問題,你還可以給 `-role node` 傳遞一個垃圾參數:
java -jar selenium-server-standalone-2.21.0.jar -role node xx
你將先看到 “INFO...” 和一個 “ERROR”,在其后你將看到 Selenium-Grid 的命令行選項。我們沒有列出這個命令的所有輸出,因為它實在太長了,這個輸出的最初幾行看起來如下:
Jul 19, 2012 10:10:39 AM org.openqa.grid.selenium.GridLauncher main
INFO: Launching a selenium grid node
org.openqa.grid.common.exception.GridConfigurationException: You need to specify a hub to register to using -hubHost X -hubPort 5555. The specified config was -hubHost null -hubPort 4444
at org.openqa.grid.common.RegistrationRequest.validate(RegistrationRequest.java:610)
at org.openqa.grid.internal.utils.SelfRegisteringRemote.startRemoteServer(SelfRegisteringRemote.java:88)
at org.openqa.grid.selenium.GridLauncher.main(GridLauncher.java:72)
Error building the config :You need to specify a hub to register to using -hubHost X -hubPort 5555. The specified config was -hubHost null -hubPort 4444
Usage :
-hubConfig:
(hub) a JSON file following grid2 format.
-nodeTimeout:
(node) <XXXX> the timeout in seconds before the hub
automatically ends a test that hasn't had aby activity than XX
sec.The browser will be released for another test to use.This
typically takes care of the client crashes.
## 常見錯誤
### Unable to acess the jarfile
Unable to access jarfile selenium-server-standalone-2.21.0.jar
無論是啟動中心還是節點都有可能產生這個錯誤。這意味著 java 無法找到 selenium-server jar 包。你需要從 selenium-server-XXXX.jar 文件存放在目錄運行命令或者指定 jar 包的完整路徑。