Selenium Grid 入門指南

簡易 Selenium Grid 的操作說明

快速開始

  1. 先決條件
  2. 啟動 Grid
    • java -jar selenium-server-<version>.jar standalone
  3. 將您的 WebDriver 測試指向* https://#:4444
  4. (可選) 開啟瀏覽器並前往 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 偵測可用的驅動程式。

以下命令假設 NodeHub 在同一部機器上執行。

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 在不同的機器上

HubNode 透過 HTTP 和 事件總線 進行通訊 (事件總線位於 Hub 內部)。Node 透過 事件總線Hub 發送訊息,以啟動註冊程序。當 Hub 收到訊息時,會透過 HTTP 連線到 Node 以確認其存在。

為了成功將 Node 註冊到 Hub,公開 Hub 機器上的 事件總線 連接埠 (預設為 4442 和 4443) 非常重要。這也適用於 Node 連接埠。如此一來,HubNode 就能夠進行通訊。

如果 Hub 使用預設連接埠,則可以使用 --hub 旗標來註冊 Node

java -jar selenium-server-<version>.jar node --hub http://<hub-ip>:4444

Hub 未使用預設連接埠時,則需要 --publish-events--subscribe-events 旗標。

例如,如果 Hub 使用連接埠 888688878888

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 時,每個組件都是獨立啟動的,理想情況下是在不同的機器上。

  1. 事件總線:啟用不同 Grid 組件之間的內部通訊。

預設連接埠為:444244435557

java -jar selenium-server-<version>.jar event-bus --publish-events tcp://<event-bus-ip>:4442 --subscribe-events tcp://<event-bus-ip>:4443 --port 5557
  1. 新 Session 佇列:將新的 Session 請求新增至佇列,分配器將會查詢該佇列

預設連接埠為 5559

java -jar selenium-server-<version>.jar sessionqueue --port 5559
  1. Session Map:將 Session ID 對應到 Session 正在執行的 Node

預設 Session Map 連接埠為 5556Session Map事件總線 互動。

java -jar selenium-server-<version>.jar sessions --publish-events tcp://<event-bus-ip>:4442 --subscribe-events tcp://<event-bus-ip>:4443 --port 5556
  1. 分配器:查詢 新 Session 佇列 以取得新的 Session 請求,並在功能符合時將其分配給 NodeNode 以註冊到 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
  1. 路由器:將新的 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
  1. 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

Selenium v4.5

預設情況下,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 個 NodeHub/Node 可能運作良好。以下值並非一成不變,歡迎提供意見反應!

小型

獨立模式或具有 5 個或更少 NodeHub/Node

中型

Hub/Node 在 6 到 60 個 Node 之間。

大型

Hub/Node 在 60 到 100 個 Node 之間。超過 100 個 Node分散式

警告

Selenium Grid 必須使用適當的防火牆權限來防止外部存取。

未能保護您的 Grid 可能會導致以下一項或多項情況發生

  • 您提供對 Grid 基礎架構的開放存取
  • 您允許第三方存取內部 Web 應用程式和檔案
  • 您允許第三方執行自訂二進位檔案

請參閱 Detectify 上的這篇部落格文章,其中很好地概述了公開的 Grid 可能會如何被濫用:不要讓您的 Grid 完全開放

延伸閱讀

  • 組件:了解 Grid 的內部組件如何相互關聯。
  • 組態設定:自訂您的 Grid 設定。
  • 架構:了解 Grid 中的關鍵概念。
  • 進階功能:透過 Grid 的功能探索更多可能性。
上次修改日期:2024 年 9 月 10 日:Transparent png favicons (#1937)[deploy site] (03705be0833)