設定您自己的 Grid 3
若要使用 Selenium Grid,您需要維護您自己的節點基礎架構。由於這可能是一項繁瑣且耗時的工作,許多組織使用 IaaS 提供商,例如 Amazon EC2 和 Google Compute 來提供此基礎架構。
其他選項包括使用 Sauce Labs 或 Testing Bot 等供應商,他們在雲端中提供 Selenium Grid 作為服務。當然,也可以在您自己的硬體上執行節點。本章將詳細介紹執行您自己的 Grid 的選項,包括其自己的節點基礎架構。
快速開始
此範例將向您展示如何啟動 Selenium 2 Grid Hub,並註冊 WebDriver 節點和 Selenium 1 RC 舊版節點。我們也將向您展示如何從 Java 呼叫 Grid。此處顯示 Hub 和節點在同一部機器上執行,但您當然可以將 selenium-server-standalone 複製到多部機器。
selenium-server-standalone
套件包含執行 Grid 所需的 Hub、WebDriver 和舊版 RC,不再需要 ant。您可以從 https://selenium.dev.org.tw/downloads/ 下載 selenium-server-standalone.jar
。
步驟 1:啟動 Hub
Hub 是接收測試請求並將其分配到正確節點的中心點。分配是根據功能進行的,這表示需要一組功能的測試只會分配給提供該組或功能子集的節點。
由於測試的所需功能只是名稱所暗示的所需,因此 Hub 無法保證它會找到完全符合請求的所需功能集的節點。
開啟命令提示字元並導航到您複製 selenium-server-standalone.jar
檔案的目錄。您透過將 -role hub
標誌傳遞給獨立伺服器來啟動 Hub
java -jar selenium-server-standalone.jar -role hub
Hub 預設會監聽埠 4444。您可以開啟瀏覽器視窗並導航至 https://#:4444/grid/console 來檢視 Hub 的狀態。
若要變更預設埠,您可以新增選用的 -port
標誌,其中包含一個整數,表示執行命令時要監聽的埠。此外,您在 JSON 組態檔(如下所示)中看到的所有其他選項都是可能的命令列標誌。
您當然可以僅使用上面顯示的簡單命令來完成,但如果您需要更進階的組態,您也可以指定 JSON 格式的組態檔,為了方便起見,在啟動 Hub 時進行組態。您可以這樣做
java -jar selenium-server-standalone.jar -role hub -hubConfig hubConfig.json -debug
您將在下方看到 hubConfig.json
檔案的範例。我們將在步驟 2 中更詳細地介紹如何提供節點組態檔。
{
"_comment" : "Configuration for Hub - hubConfig.json",
"host": ip,
"maxSession": 5,
"port": 4444,
"cleanupCycle": 5000,
"timeout": 300000,
"newSessionWaitTimeout": -1,
"servlets": [],
"prioritizer": null,
"capabilityMatcher": "org.openqa.grid.internal.utils.DefaultCapabilityMatcher",
"throwOnCapabilityNotPresent": true,
"nodePolling": 180000,
"platform": "WINDOWS"}
步驟 2:啟動節點
無論您想要執行具有新的 WebDriver 功能的 Grid,還是具有 Selenium 1 RC 功能的 Grid,或同時執行兩者,您都使用相同的 selenium-server-standalone.jar
檔案來啟動節點
java -jar selenium-server-standalone.jar -role node -hub https://#:4444
如果未透過 -port
標誌指定埠,則會選擇一個可用埠。您可以在一部機器上執行多個節點,但如果您這樣做,您需要注意系統記憶體資源以及測試擷取螢幕截圖時的問題。
使用選項組態節點
如前所述,為了向後相容,「wd」和「rc」角色仍然是「node」角色的有效子集。但是這些角色限制了與其對應 API 的遠端連線類型,而「node」允許 RC 和 WebDriver 遠端連線。
在命令列上傳遞 JVM 屬性(使用 -D
標誌在 -jar 參數之前),這些屬性也將被選取並傳播到節點
-Dwebdriver.chrome.driver=chromedriver.exe
使用 JSON 組態節點
您也可以啟動使用 JSON 組態檔組態的 Grid 節點
java -Dwebdriver.chrome.driver=chromedriver.exe -jar selenium-server-standalone.jar -role node -nodeConfig node1Config.json
以下是 nodeConfig.json
檔案的範例
{
"capabilities": [
{
"browserName": "firefox",
"acceptSslCerts": true,
"javascriptEnabled": true,
"takesScreenshot": false,
"firefox_profile": "",
"browser-version": "27",
"platform": "WINDOWS",
"maxInstances": 5,
"firefox_binary": "",
"cleanSession": true
},
{
"browserName": "chrome",
"maxInstances": 5,
"platform": "WINDOWS",
"webdriver.chrome.driver": "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe"
},
{
"browserName": "internet explorer",
"maxInstances": 1,
"platform": "WINDOWS",
"webdriver.ie.driver": "C:/Program Files (x86)/Internet Explorer/iexplore.exe"
}
],
"configuration": {
"_comment" : "Configuration for Node",
"cleanUpCycle": 2000,
"timeout": 30000,
"proxy": "org.openqa.grid.selenium.proxy.WebDriverRemoteProxy",
"port": 5555,
"host": ip,
"register": true,
"hubPort": 4444,
"maxSession": 5
}
}
關於 -host
標誌的注意事項
對於 Hub 和節點,如果未指定 -host
標誌,則預設會使用 0.0.0.0
。這將繫結到機器的所有公開(非迴路) IPv4 介面。如果您有特殊的網路組態或任何建立額外網路介面的組件,建議您將 -host
標誌設定為允許從不同機器存取 Hub/節點的值。
指定埠
Hub 使用的預設 TCP/IP 埠為 4444。如果您需要變更埠,請使用上述組態。
疑難排解
使用日誌檔
對於進階疑難排解,您可以指定日誌檔來記錄系統訊息。使用 -log 參數啟動 Selenium GRID Hub 或節點。請參閱以下範例
java -jar selenium-server-standalone.jar -role hub -log log.txt
使用您最喜歡的文字編輯器開啟日誌檔(在上述範例中為 log.txt)以尋找「ERROR」日誌(如果您遇到問題)。
使用 -debug
參數
您也可以使用 -debug
參數將偵錯日誌列印到主控台。使用 -debug
參數啟動 Selenium Grid Hub 或節點。請參閱以下範例
java -jar selenium-server-standalone.jar -role hub -debug
警告
必須使用適當的防火牆權限來保護 Selenium Grid 免於外部存取。
未能保護您的 Grid 可能會導致以下一項或多項情況發生
- 您提供對 Grid 基礎架構的開放存取權
- 您允許第三方存取內部 Web 應用程式和檔案
- 您允許第三方執行自訂二進位檔
請參閱 Detectify 上的這篇部落格文章,其中很好地概述了公開的 Grid 可能如何被濫用:不要讓您的 Grid 完全開放。
Docker Selenium
Docker 提供了一種方便的方式來在稱為容器的單元中佈建和擴展 Selenium Grid 基礎架構。容器是軟體的標準化單元,其中包含執行所需應用程式所需的一切,包括所有相依性,以便在不同的機器上以可靠且可重複的方式執行。
Selenium 專案維護一組 Docker 映像檔,您可以下載並執行這些映像檔以快速啟動並執行可運作的 Grid。節點適用於 Firefox 和 Chrome。有關如何佈建 Grid 的完整詳細資訊,請參閱 Docker Selenium 儲存庫。
先決條件
執行 Grid 的唯一要求是已安裝並可運作 Docker。 安裝 Docker。