開發一個好的網路應用程式意味著它必須是可用、功能完整且相容的。嚴格的端對端測試可確保推出穩定的網路應用程式。在所有可能的瀏覽器上進行測試可保證良好的使用者體驗。
Nightwatch 是一個用於網路應用程式的端對端自動化測試解決方案。開發人員和測試工程師可以使用 Nightwatch 撰寫測試,並輕鬆針對各種瀏覽器,而無需擔心測試不穩定性。
考慮一個基礎架構設定,其中不同的瀏覽器位於不同的作業系統機器上。現在,測試和基礎架構都已準備就緒。但是,我們如何將測試委派到基礎架構上執行?Selenium Grid 可以無縫地將兩者結合在一起。Selenium Grid 有助於有效地找到執行測試的正確環境。
什麼是 Selenium Grid?
Selenium Grid 是一個中心點,有助於分散式測試、擴展多個環境和負載平衡傳入的測試。Grid 通過支援跨多種瀏覽器和作業系統組合的平行測試來提高測試效率。所有測試都指向 Grid,它會智慧地將測試路由到基礎架構上執行。
如果您有本機或雲端裝置伺服器陣列,Selenium Grid 將處理所有網路測試的委派需求。

Selenium Grid 的功能分為以下幾個元件:
路由器 (Router)
顧名思義,路由器的主要責任是將請求路由到正確的元件。任何對 Selenium Grid 的請求都會先傳送到路由器。路由器會根據請求識別可處理該請求的 Grid 元件。
分配器 (Distributor)
分配器維護所有已註冊節點的模型。分配器會將新的會話請求與適當的節點匹配,並啟動會話建立。它還會定期 ping 節點的健康檢查,並追蹤節點的活動訊號。
節點 (Node)
節點存在於託管作業系統和瀏覽器的機器上。因此,節點會與 Web 驅動程式互動,並將瀏覽器命令轉發給它們。每個節點都包含一組功能。功能是瀏覽器名稱、瀏覽器版本和作業系統的組合。
啟動時,節點會向 Grid 註冊自己。分配器會處理節點註冊。
會話地圖 (Session Map)
會話地圖包含會話 ID 和會話執行所在節點的對應關係。對於每個現有會話的請求,路由器會使用會話地圖來查詢節點,並將請求轉發到各自的節點。
新會話佇列 (New Session Queue)
新會話佇列會將每個新的會話請求排入佇列。新會話佇列是 FIFO 佇列。同時,分配器會定期檢查是否有任何節點具有新會話的容量。如果有的話,分配器會阻止節點中的匹配插槽,並從新會話佇列中移除請求。節點會建立會話並回應用戶端。
新會話佇列還具有請求重試和請求逾時機制。
事件匯流排 (Event Bus)
Grid 元件利用事件匯流排透過訊息彼此互動。Grid 元件透過事件匯流排彼此通訊。
設定 Selenium Grid
先決條件
- 請確保已下載 Java。如果沒有,請下載並在將執行 Grid 的機器上設定 Java。
- 從 Selenium 下載頁面下載最新的 jar。
- 請確保 Web 驅動程式位於系統路徑中。有關詳細資訊,請參閱安裝瀏覽器驅動程式。伺服器將自動偵測路徑上的驅動程式。此行為是可設定的。
Selenium Grid 可以設定為以下三種模式中的任何一種:獨立模式、中心和節點模式,以及完全分散式模式。
在這三種模式中,預設伺服器位址為 http://localhost:4444。
獨立模式
獨立模式將所有 Grid 元件集中在一個位置。這是開始使用 Grid 的最快方式。
java -jar selenium-server-${grid-version}>.jar standalone
中心和節點模式
中心包含路由器、分配器、新會話佇列、會話地圖和事件匯流排。節點包含節點和事件匯流排,以允許與中心通訊。
啟動中心
java -jar selenium-server-${grid-version}.jar hub
啟動節點
java -jar selenium-server-${grid-version}.jar node
完全分散式模式
每個 Grid 元件在完全分散式模式下獨立執行。所有 Grid 元件都依賴事件匯流排彼此通訊。
啟動事件匯流排
java -jar selenium-server-${grid-version}.jar event-bus
啟動會話地圖
java -jar selenium-server-${grid-version}.jar sessions
啟動新會話佇列
java -jar selenium-server-${grid-version}.jar sessionqueue
啟動分配器
java -jar selenium-server-${grid-version}.jar distributor --sessions http://localhost:5556 --sessionqueue http://localhost:5559 --bind-bus false
啟動路由器
java -jar selenium-server-${grid-version}.jar router --sessions http://localhost:5556 --distributor http://localhost:5553 --sessionqueue http://localhost:5559
啟動節點
java -jar selenium-server-${grid-version}.jar node
若要檢查 Grid 是否已啟動,請 ping http://<grid-url>/status
端點。
每個元件都有可設定的 CLI 選項。
Docker
Selenium Grid 也支援 Docker。請參閱Selenium Docker 以開始使用。
Grid UI
導覽至 http://<grid-url>/ui
。
Grid UI 顯示包含所有節點的 Grid 模型。用於顯示進行中會話和佇列中等待會話的單獨索引標籤。
在 Selenium Grid 上執行 Nightwatch 測試
Nightwatch 隨附一些範例測試,您可以使用這些範例測試快速啟動並執行 Grid。
在本指南中,我們將假設使用 Nightwatch 2.0+。您可以透過執行以下命令來安裝它
npm i nightwatch
設定 Nightwatch 以使用 Grid
測試執行器需要一個組態檔。檔案可以使用 ".json" 或 ".js" 副檔名。由於 ".js" 具有更多的組態選項和功能,因此建議使用 ".js"。
如果沒有組態檔,Nightwatch 會執行繁重的作業,並產生一個具有 ".js" 副檔名的組態檔。它包含一組適合在任何環境中測試的選項。為簡單起見,只分享具有 selenium-server 相關選項的組態檔。只需確保 selenium-server 主機和埠與 Grid URL 匹配,您就可以開始了。
{
webdriver: {},
test_settings: {
selenium_server: {
selenium: {
start_process: false,
host: 'localhost',
port: 4444
}
},
'selenium.chrome': {
extends: 'selenium_server',
desiredCapabilities: {
browserName: 'chrome',
chromeOptions : {
w3c: true
}
}
},
'selenium.firefox': {
extends: 'selenium_server',
desiredCapabilities: {
browserName: 'firefox'
}
}
}
};
使用測試工作程式平行執行
預設情況下,test_workers
選項會停用。如果要平行執行多個測試檔案,請啟用此選項。
若要以平行模式執行,請確保 Grid 的 max-session CLI 選項設定為大於 1。預設情況下,此值會根據機器上可用的處理器數目而定。
更新 Nightwatch 組態,以設定所需的測試工作程式數目
{
test_workers : {
enabled: true,
workers: 4
}
}
請參閱組態章節,以了解和使用組態選項。
針對 Selenium Grid 執行 Nightwatch
若要使用 Chrome 針對 Selenium Grid 執行 Nightwatch
npx nightwatch examples/tests --env selenium.chrome
藉由傳遞以逗號分隔的環境清單,在多個瀏覽器上執行測試
npx nightwatch examples/tests --env selenium.chrome,selenium.firefox