Selenium Grid 入門指南
快速開始
- 先決條件
- 已安裝 Java 11 或更高版本
- 已安裝瀏覽器
- 瀏覽器驅動程式
- Selenium Manager 如果您加入
--selenium-manager true
,將會自動設定驅動程式。 - 已安裝並在
PATH
中
- Selenium Manager 如果您加入
- 從最新版本下載 Selenium Server jar 檔案
- 啟動 Grid
java -jar selenium-server-<version>.jar standalone
- 將您的 WebDriver 測試指向* https://#:4444
- (可選) 開啟瀏覽器並前往 https://#:4444,檢查正在執行的測試和可用的功能
*想知道如何將您的測試指向 https://#:4444 嗎?請查看 RemoteWebDriver
章節。
若要深入了解不同的組態設定選項,請瀏覽以下章節。
Grid 角色
Grid 由六個不同的組件組成,讓您可以選擇以不同的方式部署它。
根據您的需求,您可以單獨啟動每個組件 (分散式)、將它們分組在 Hub & Node 中,或全部在單一機器上 (獨立模式)。
獨立模式
獨立模式將所有 Grid 組件無縫地整合到一個中。在獨立模式下執行 Grid,您只需一個命令即可獲得功能完整的 Grid,並在單一進程中完成。獨立模式只能在單一機器上執行。
獨立模式也是啟動 Selenium Grid 最簡單的模式。預設情況下,伺服器將在 https://#:4444 上監聽 RemoteWebDriver
請求。預設情況下,伺服器將從系統 PATH
偵測可用的驅動程式。
java -jar selenium-server-<version>.jar standalone
在獨立模式下成功啟動 Grid 後,將您的 WebDriver 測試指向 https://#:4444。
獨立模式的常見使用案例包括
- 在本機使用
RemoteWebDriver
開發或偵錯測試 - 在推送程式碼之前執行快速測試套件
- 在 CI/CD 工具 (GitHub Actions、Jenkins 等) 中輕鬆設定 Grid
Hub 和 Node
Hub 和 Node 是最常用的角色,因為它允許
- 在單一 Grid 中組合不同的機器
- 例如,具有不同作業系統和/或瀏覽器版本的機器
- 擁有單一入口點,可在不同的環境中執行 WebDriver 測試
- 在不拆除 Grid 的情況下擴充或縮減容量
Hub
Hub 由以下組件組成:路由器、分配器、Session Map、新 Session 佇列和事件總線。
java -jar selenium-server-<version>.jar hub
預設情況下,伺服器將在 https://#:4444 上監聽 RemoteWebDriver
請求。
Node
在啟動時,Node 將從系統 PATH
偵測可用的驅動程式。
以下命令假設 Node 與 Hub 在同一部機器上執行。
java -jar selenium-server-<version>.jar node
同一部機器上有多個 Node
Node 1
java -jar selenium-server-<version>.jar node --port 5555
Node 2
java -jar selenium-server-<version>.jar node --port 6666
Node 和 Hub 在不同的機器上
Hub 和 Node 透過 HTTP 和 事件總線 進行通訊 (事件總線位於 Hub 內部)。Node 透過 事件總線 向 Hub 發送訊息,以啟動註冊程序。當 Hub 收到訊息時,會透過 HTTP 連線到 Node 以確認其存在。
為了成功將 Node 註冊到 Hub,公開 Hub 機器上的 事件總線 連接埠 (預設為 4442 和 4443) 非常重要。這也適用於 Node 連接埠。如此一來,Hub 和 Node 就能夠進行通訊。
如果 Hub 使用預設連接埠,則可以使用 --hub
旗標來註冊 Node
java -jar selenium-server-<version>.jar node --hub http://<hub-ip>:4444
當 Hub 未使用預設連接埠時,則需要 --publish-events
和 --subscribe-events
旗標。
例如,如果 Hub 使用連接埠 8886
、8887
和 8888
java -jar selenium-server-<version>.jar hub --publish-events tcp://<hub-ip>:8886 --subscribe-events tcp://<hub-ip>:8887 --port 8888
Node 需要使用這些連接埠才能成功註冊
java -jar selenium-server-<version>.jar node --publish-events tcp://<hub-ip>:8886 --subscribe-events tcp://<hub-ip>:8887
分散式
當使用分散式 Grid 時,每個組件都是獨立啟動的,理想情況下是在不同的機器上。
- 事件總線:啟用不同 Grid 組件之間的內部通訊。
預設連接埠為:4442
、4443
和 5557
。
java -jar selenium-server-<version>.jar event-bus --publish-events tcp://<event-bus-ip>:4442 --subscribe-events tcp://<event-bus-ip>:4443 --port 5557
- 新 Session 佇列:將新的 Session 請求新增至佇列,分配器將會查詢該佇列
預設連接埠為 5559
。
java -jar selenium-server-<version>.jar sessionqueue --port 5559
- Session Map:將 Session ID 對應到 Session 正在執行的 Node
預設 Session Map 連接埠為 5556
。Session Map 與 事件總線 互動。
java -jar selenium-server-<version>.jar sessions --publish-events tcp://<event-bus-ip>:4442 --subscribe-events tcp://<event-bus-ip>:4443 --port 5556
- 分配器:查詢 新 Session 佇列 以取得新的 Session 請求,並在功能符合時將其分配給 Node。Node 以註冊到 Hub/Node Grid 中的 Hub 的方式註冊到 分配器。
預設 分配器 連接埠為 5553
。分配器 與 新 Session 佇列、Session Map、事件總線 和 Node 互動。
java -jar selenium-server-<version>.jar distributor --publish-events tcp://<event-bus-ip>:4442 --subscribe-events tcp://<event-bus-ip>:4443 --sessions http://<sessions-ip>:5556 --sessionqueue http://<new-session-queue-ip>:5559 --port 5553 --bind-bus false
- 路由器:將新的 Session 請求重新導向至佇列,並將正在執行的 Session 請求重新導向至執行該 Session 的 Node。
預設 路由器 連接埠為 4444
。路由器 與 新 Session 佇列、Session Map 和 分配器 互動。
java -jar selenium-server-<version>.jar router --sessions http://<sessions-ip>:5556 --distributor http://<distributor-ip>:5553 --sessionqueue http://<new-session-queue-ip>:5559 --port 4444
- Node
預設 Node 連接埠為 5555
。
java -jar selenium-server-<version>.jar node --publish-events tcp://<event-bus-ip>:4442 --subscribe-events tcp://<event-bus-ip>:4443
測試中的元數據
將元數據新增至您的測試,並透過 GraphQL 取用它,或透過 Selenium Grid UI 可視化部分元數據 (例如 se:name
)。
可以透過在功能前加上 se:
來新增元數據。以下是 Java 中的一個快速範例,展示了這一點。
ChromeOptions chromeOptions = new ChromeOptions();
chromeOptions.setCapability("browserVersion", "100");
chromeOptions.setCapability("platformName", "Windows");
// Showing a test name instead of the session id in the Grid UI
chromeOptions.setCapability("se:name", "My simple test");
// Other type of metadata can be seen in the Grid UI by clicking on the
// session info or via GraphQL
chromeOptions.setCapability("se:sampleMetadata", "Sample metadata value");
WebDriver driver = new RemoteWebDriver(new URL("http://gridUrl:4444"), chromeOptions);
driver.get("http://www.google.com");
driver.quit();
查詢 Selenium Grid
啟動 Grid 後,主要有兩種查詢其狀態的方式,透過 Grid UI 或透過 API 呼叫。
可以透過開啟您偏好的瀏覽器並前往 https://#:4444 來存取 Grid UI。
API 呼叫可以透過 https://#:4444/status 端點或使用 GraphQL 來完成
為了簡潔起見,本頁顯示的所有命令範例都假設組件在本機執行。更詳細的範例和用法可以在設定組件章節中找到。
使用 Java 11 HTTP Client
預設情況下,Grid 將使用 AsyncHttpClient。AsyncHttpClient 是一個基於 Netty 建構的開源函式庫。它允許非同步執行 HTTP 請求和回應。此外,它還提供 WebSocket 支援。因此,它非常適合。
然而,自 2021 年 6 月以來,AsyncHttpClient 一直沒有積極維護。這與 Java 11+ 提供內建 HTTP 和 WebSocket 客戶端的事實相符。目前,Selenium 計劃將支援的最低版本升級到 Java 11。然而,這是一項相當大的工程。將其與主要版本發佈和隨附公告對齊,對於確保使用者體驗完整至關重要。
若要使用 Java 11 客戶端,您需要下載 selenium-http-jdk-client
jar 檔案,並使用 --ext
旗標使其在 Grid jar 的類別路徑中可用。
可以直接從 repo1.maven.org 下載 jar 檔案,然後以以下方式啟動 Grid
java -Dwebdriver.http.factory=jdk-http-client -jar selenium-server-<version>.jar --ext selenium-http-jdk-client-<version>.jar standalone
下載 selenium-http-jdk-client
jar 檔案的替代方法是使用 Coursier。
java -Dwebdriver.http.factory=jdk-http-client -jar selenium-server-<version>.jar --ext $(coursier fetch -p org.seleniumhq.selenium:selenium-http-jdk-client:<version>) standalone
如果您使用 Hub/Node 模式或分散式模式,則需要為每個組件設定 -Dwebdriver.http.factory=jdk-http-client
和 --ext
旗標。
Grid 規模
選擇 Grid 角色取決於需要支援哪些作業系統和瀏覽器、需要執行的平行 Session 數量、可用機器的數量以及這些機器的效能 (CPU、RAM)。
並行建立 Session 依賴於分配器可用的處理器。例如,如果一部機器有 4 個 CPU,則 分配器 將只能並行建立最多 4 個 Session。
預設情況下,Node 支援的最大並行 Session 數量受可用 CPU 數量的限制。例如,如果 Node 機器有 8 個 CPU,則它可以執行最多 8 個並行瀏覽器 Session (Safari 除外,它始終為一個)。此外,預計每個瀏覽器 Session 應使用約 1GB RAM。
一般來說,建議 Node 盡可能小。與其使用具有 32 個 CPU 和 32GB RAM 的機器來執行 32 個並行瀏覽器 Session,不如使用 32 個小型 Node,以便更好地隔離進程。這樣,如果 Node 發生故障,它將以隔離的方式進行。Docker 是實現此方法的好工具。
請注意,預設值 (每個瀏覽器 1CPU/1GB RAM) 僅為建議,可能不適用於您的情況。建議將它們用作參考,但持續測量效能將有助於確定您環境的理想值。
Grid 規模與支援的並行 Session 數量和 Node 數量相關,沒有「一體適用」的規模。以下提及的規模是粗略的估計,可能因不同環境而異。例如,當 Hub 具有足夠的資源時,具有 120 個 Node 的 Hub/Node 可能運作良好。以下值並非一成不變,歡迎提供意見反應!
小型
獨立模式或具有 5 個或更少 Node 的 Hub/Node。
中型
Hub/Node 在 6 到 60 個 Node 之間。
大型
Hub/Node 在 60 到 100 個 Node 之間。超過 100 個 Node 的分散式。
警告
Selenium Grid 必須使用適當的防火牆權限來防止外部存取。
未能保護您的 Grid 可能會導致以下一項或多項情況發生
- 您提供對 Grid 基礎架構的開放存取
- 您允許第三方存取內部 Web 應用程式和檔案
- 您允許第三方執行自訂二進位檔案
請參閱 Detectify 上的這篇部落格文章,其中很好地概述了公開的 Grid 可能會如何被濫用:不要讓您的 Grid 完全開放