Selenium Grid 2
此文件先前位於 wiki 上
您可以閱讀我們的 Grid 4 文件以取得更多資訊
簡介
Grid 允許您
- 透過在多部機器上分散測試來擴展規模 (平行執行)
- 從中央點管理多個環境,輕鬆針對各種瀏覽器/作業系統組合執行測試。
- 透過允許您實作自訂 hook 以利用虛擬基礎架構等方式,最大限度地減少 Grid 的維護時間。
快速開始
此範例將示範如何啟動 Selenium 2 Hub,並註冊 WebDriver 節點和 Selenium 1 RC 舊版節點。我們也將示範如何從 Java 呼叫 Grid。Hub 和節點在此處顯示在同一部機器上執行,但您當然可以將 selenium-server-standalone 複製到多部機器。注意:selenium-server-standalone 套件包含執行 Grid 所需的 Hub、WebDriver 和舊版 RC。不再需要 Ant。您可以從 http://selenium-release.storage.googleapis.com/index.html 下載 selenium-server-standalone-
*
.jar 這個逐步解說假設您已經安裝 Java。
步驟 1:啟動 Hub
Hub 是中央點,將接收所有測試請求並將其分配到正確的節點。
開啟命令提示字元並導航到您複製 selenium-server-standalone 檔案的目錄。輸入以下命令
java -jar selenium-server-standalone-<version>.jar -role hub
Hub 將自動使用預設連接埠 4444 啟動。若要變更預設連接埠,您可以在執行命令時新增選用參數 -port。您可以開啟瀏覽器視窗並導航至:https://#:4444/grid/console 來檢視 Hub 的狀態
步驟 2:啟動節點
無論您是要使用新的 WebDriver 功能執行 Grid,還是使用 Selenium 1 RC 功能執行 Grid,或同時使用兩者,您都可以使用相同的 selenium-server-standalone jar 檔案來啟動節點。
java -jar selenium-server-standalone-<version>.jar -role node -hub https://#:4444/grid/register
注意:如果未指定連接埠,且在提供「-role」選項但不是 hub 時,連接埠預設為 5555。
為了向後相容,「wd」和「rc」角色仍然是「node」角色的有效子集。但這些角色限制了與其對應 API 的遠端連線類型,而「node」則允許 RC 和 WebDriver 遠端連線。
使用 Grid 執行測試
(以 Java 為例) 現在 Grid 已就緒,我們需要從我們的測試案例存取 Grid。對於 Selenium 1 RC 節點,您可以繼續使用 DefaultSelenium 物件並傳入 Hub 資訊
Selenium selenium = new DefaultSelenium(“localhost”, 4444, “*firefox”, “http://www.google.com”);
對於 WebDriver 節點,您將需要使用 RemoteWebDriver 和 DesiredCapabilities 物件來定義您想要使用的瀏覽器、版本和平台。建立您想要針對其執行測試的目標瀏覽器功能
DesiredCapabilities capability = DesiredCapabilities.firefox();
將其傳遞到 RemoteWebDriver 物件中
WebDriver driver = new RemoteWebDriver(new URL("https://#:4444/wd/hub"), capability);
然後 Hub 會將測試分配給相符的節點。
如果滿足所有請求的功能,則節點會相符。若要在 Grid 上請求特定功能,請在將其傳遞到 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”);
未指定的功能將被忽略。如果您指定 Grid 上不存在的功能 (例如,您的測試指定 Firefox 版本 4.0,但沒有 Firefox 4 執行個體),則不會有相符項,且測試將無法執行。
設定節點
節點可以透過 2 種不同的方式設定;一種是透過指定命令列參數,另一種是透過指定 JSON 檔案。
透過命令列設定節點
預設情況下,啟動節點允許同時使用 11 個瀏覽器…:5 個 Firefox、5 個 Chrome、1 個 Internet Explorer。並行測試的最大數量預設設定為 5。若要變更此設定和其他瀏覽器設定,您可以將參數傳遞到每個 -browser 切換器 (每個切換器代表一個基於您的參數的節點)。如果您使用 -browser 參數,則預設瀏覽器將被忽略,且僅使用您在命令列中指定的瀏覽器。
-browser browserName=firefox,version=3.6,maxInstances=5,platform=LINUX
此設定在 Linux 機器上啟動 5 個 Firefox 3.6 節點。
如果您的遠端機器有多個您想要使用的 Firefox 版本,您可以將每個二進位檔案的位置對應到同一部機器上的特定版本
-browser browserName=firefox,version=3.6,firefox_binary=/home/myhomedir/firefox36/firefox,maxInstances=3,platform=LINUX -browser browserName=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 將永遠不會釋出節點。
注意:這不是所有「等待 WebElement」類型命令的 WebDriver 逾時。
-maxSession 5
(5 為預設值) 可以在節點上並行執行的瀏覽器最大數量。這與支援瀏覽器的 maxInstance 不同 (範例:對於支援 Firefox 3.6、Firefox 4.0 和 Internet Explorer 8 的節點,maxSession=1 將確保您永遠不會同時執行超過 1 個瀏覽器。使用 maxSession=2,您可以同時執行 2 個 Firefox 測試,或 1 個 Internet Explorer 和 1 個 Firefox 測試)。-browser < params >
如果未設定 -browser,則節點將啟動 5 個 Firefox、1 個 Chrome 和 1 個 Internet Explorer 執行個體 (假設它在 Windows 電腦上)。可以在同一行中多次設定此參數,以定義多種類型的瀏覽器。-browser 允許的參數:browserName={android, chrome, firefox, htmlunit, internet explorer, iphone, opera} version={瀏覽器版本} firefox_binary={可執行二進位檔案的路徑} chrome_binary={可執行二進位檔案的路徑} maxInstances={此類型瀏覽器的最大數量} platform={WINDOWS, LINUX, MAC}-registerCycle N
= 節點將嘗試重新註冊自身的頻率 (以毫秒為單位)。允許重新啟動 Hub,而無需重新啟動節點。真正大型 (>50 個節點) 的 Hub 安裝可能需要透過在 Java 命令列上設定 -DPOOL_MAX=512 (或更大) 來增加 Jetty 線程。
設定逾時 (需要 2.21 版本)
Grid 中的逾時通常應透過 webDriver.manage().timeouts() 處理,這將控制不同操作的逾時時間。
為了保持使用 selenium-server 的 Grid 的執行時完整性,還有兩個可以設定的逾時值。
在 Hub 上,將 -timeout 命令列選項設定為「30」秒將確保在用戶端崩潰後 30 秒回收所有資源。在 Hub 上,您也可以設定 -browserTimeout 60,使節點願意在瀏覽器內掛起的最大時間為 60 秒。這將確保在略多於 60 秒後回收所有資源。如果設定了這兩個值,則所有節點都從 Hub 使用這些值。在單個節點上本機設定的參數具有優先權,通常建議不要在節點上設定這些逾時。
browserTimeout 應為
- 高於 Socket Lock 逾時 (45 秒)
- 通常高於 webDriver.manage().timeouts() 中使用的值,因為此機制是「最後一道防線」。
透過 JSON 設定節點
java -jar selenium-server-standalone.jar -role node -nodeConfig nodeconfig.json
伺服器版本 3.x.x (>= beta4) 的節點設定檔範例可以在 https://github.com/SeleniumHQ/selenium/blob/selenium-3.141.59/java/server/src/org/openqa/grid/common/defaults/DefaultNodeWebDriver.json 找到
伺服器版本 2.x.x 的節點設定檔範例可以在 https://github.com/SeleniumHQ/selenium/blob/selenium-2.53.0/java/server/src/org/openqa/grid/common/defaults/DefaultNode.json 找到
注意:版本 2.x.x 中的 configuration { ... }
物件已在版本 3.x.x (>= beta4) 中扁平化
透過 JSON 設定 Hub
java -jar selenium-server-standalone.jar -role hub -hubConfig hubconfig.json
hubconfig.json 檔案範例可以在 https://github.com/SeleniumHQ/selenium/blob/selenium-3.141.59/java/server/src/org/openqa/grid/common/defaults/DefaultHub.json 找到
Hub 診斷訊息
偵測到異常使用模式時,Hub 可以提供以下訊息
Client requested session XYZ that 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 | 工作階段已被捨棄,因為節點已在 Grid 上重新註冊 (在測試中) |
使用 Grid 執行的提示
如果您的測試是並行執行的,請確保每個線程獨立於在其他線程上執行的任何其他測試來解除分配其 WebDriver 資源。在測試執行開始時啟動每個線程 1 個瀏覽器,並在結束時解除分配所有瀏覽器不是一個好主意。(如果一個測試案例決定消耗異常多的時間,您可能會在所有其他測試中遇到逾時,因為它們都在等待緩慢的測試。這可能會非常令人困惑)
Selenium Grid 平台
(先前位置:https://github.com/SeleniumHQ/selenium/wiki/Grid-Platforms)
本節描述用於設定 Selenium Grid 節點和 [DesiredCapabilities] 物件的 PLATFORM 選項。
平台歷史
從 Grid 請求新的 WebDriver 工作階段時,使用者可以指定遠端瀏覽器的 [DesiredCapabilities]。測試可以指定瀏覽器名稱、版本和平台等項目。指定期望的功能。
以下程式碼示範了 Windows XP 平台上 Internet Explorer 版本 9 的 DesiredCapability
[[DesiredCapabilities]] capability = DesiredCapabilities.internetExplorer();
capability.setVersion("8");
capability.setPlatform(Platform.XP);
WebDriver driver = new RemoteWebDriver(new URL("https://#:4444/wd/hub"), capability);
對具有指定 DesiredCapability 的新工作階段的請求會傳送到 Grid Hub,Hub 將搜尋所有已註冊的節點,以查看是否有任何節點符合測試給定的規格。如果沒有節點符合規格,則會傳回 CapabilityNotPresentOnTheGridException。
一個常見的誤解是 PLATFORM 決定了選擇將在其上建立新工作階段的作業系統的能力。在這種情況下,平台和作業系統並不相同,因此將平台指定為「Windows 2003 Server」不會讓您在 Windows XP、Vista 和 2003 Server 之間進行選擇。這種誤解可能源自 Mac OSX 和 Linux 等平台,其中平台的名稱與作業系統的名稱相符。
就 Selenium Grid 而言,平台是指驅動程式原子與網頁瀏覽器之間的底層互動。Mac OSX 和 Linux 作業系統 (Centos、Ubuntu、Debian 等) 與 Firefox 和 Chrome 等網頁瀏覽器具有相對穩定的通訊。因此,平台名稱很容易理解,如下例所示
capability.setPlatform(Platform.MAC); //Set platform to OSX
capability.setPlatform(Platform.LINUX); // Set platform to Linux based systems
在 Vista 發佈之前,Windows 作業系統只有一個平台,如下所示
capability.setPlatform(Platform.WINDOWS); //Set platform to Windows
但是,隨著 Windows Vista 中 UAC 的引入,WebDriver 和 Internet Explorer 之間的底層互動發生了重大變更。為了解決 UAC 限制,為具有 Windows 作業系統的節點新增了一個新平台
capability.setPlatform(Platform.VISTA); //Set platform to VISTA
隨著 Windows 8 的發佈,WebDriver 與 Internet Explorer 的通訊方式再次發生重大變革,因此為基於 Windows 8 的節點新增了一個新平台
capability.setPlatform(Platform.WIN8); //Set platform to Windows 8
Windows 8.1 的推出也發生了類似的情況,在此範例中,平台設定為 Windows 8.1
capability.setPlatform(Platform.WIN8_1); //Set platform to Windows 8.1
作業系統平台
以下列表示範了一些作業系統及其所屬的平台
MAC****所有 OSX 作業系統 LINUX Centos Ubuntu UNIXSolarisBSD XP Windows Server 2003 Windows XP Windows NT VISTAWindows VistaWindows 2008 Server****Windows 7 WIN8 Windows 2012 Server Windows 8 WIN8_1****Windows 8.1
系列
不同的平台被分組到平台的「系列」中。例如,Win8 和 XP 平台是 WINDOWS 系列的一部分。同樣,ANDROID 和 LINUX 是 UNIX 系列的一部分。
選擇平台和平台系列
在 [DesiredCapabilities] 物件上設定平台時,我們可以設定單個平台或平台系列。例如
capability.setPlatform(Platform.VISTA); //Will return a node with Windows Vista or 2008 Server or Windows 7 Operating System.
capability.setPlatform(Platform.XP); //Will return a node with Windows XP or 2003 Server or Windows 2000 Professional Operating System.
capability.setPlatform(Platform.WINDOWS); //Will return a node with ANY Windows Operating System
更多資訊
有關最新平台的更多資訊,請檢視此檔案
org.openqa.selenium.Platform.java