Selenium 4.0beta: Grid 工作原理
Selenium 4.0 beta版已經發布,那麼距離正式版已經不遠了,在Selenium 4.0中變化比較大的就是Grid了,本文翻譯了官方文檔,重點介紹Grid 4的工作原理
Selenium Grid3工作原理
Hub
- 中介和管理
- 接受運行測試的請求
- 從客戶端獲取指令並在節點上遠程執行它們
- 管理執行緒
Hub是發送所有測試的中心點。每個selenium Grid恰好由一個Hub組成。Hub需要能夠從各自的客戶端(即CI伺服器、開發人員機器等)訪問。Hub將連接一個或多個Node
測試的節點。
Node
- Node和執行的瀏覽器在同一台主機。
- 將自己註冊到Hub上,並保持通訊。
- 接收來自Hub的請求並執行他們。
Node是在單個電腦系統上執行測試的不同的Selenium實例。Grid中可以有許多節點。作為Node的機器不需要與Hub或其他Node的平台相同,也不需要具有相同的瀏覽器選擇。Windows上的節點可以提供Internet Explorer作為瀏覽器選項,而這在Linux或Mac上是不可能的。
selenium Grid4
Router 路由器
路由器負責將請求轉發到正確的組件。
他是Grid的入口點,接收所有外部的請求。路由器行為的不同依賴於接受的請求。
如果是一個新的會話請求,路由器會把它發送給New Session Queuer
,將其添加到New Session Queue
, New Session queuer
通過Event Bus
觸發一個事件。Distributor
(處理新的會話創建的位置)將會接收事件並輪詢新Session Queue
來獲得新會話請求。
如果請求屬於已存在的會話, 路由器發送session id 到 Session Map
, 然後Session Map
返回會話運行的Node
。此後,路由器發送請求給Node
。
Distributor 分配器
Distributor
知道所有的Node
以及他們的能力。它的主要角色是接收新的 session 請求,找到適合的Node
來創建會話。Distributor
在Session Map
中存儲session id和正在執行會話的Node
之間的關係。
Node 節點
一個Node
可以在Grid中多次創建。每個Node
負責管理運行所在機器的可用瀏覽器。
Node
通過 Event Bus
向Distributor
註冊。它的配置作為註冊消息的一部分發送。
默認情況下,Node
自動註冊所在主機上所以可以運行的瀏覽器驅動程式。它還為基於Chromium 的瀏覽器和 Firefox 的每個可用 CPU 創建一個 slot(插槽?不會翻譯)。針對Safari 和 IE 只創建一個slot。通過在特定的配置,它可以在Docker容器中創建會話。你可以看到更多配置描述在後面的使用介紹中。
Node
只執行接收到的命令。它不會評估、判斷和控制任何事情。Node
運行的主機不需要擁有與其他組件相同的作業系統。例如,Windows主機的Node
提供IE瀏覽器選項,而這在Linux或Mac主機上是不可能的。
Session Map 會話映射
Session Map
是一個數據存儲,保存session id 和運行會話的Node
資訊。它在向Node
轉發請求的過程中為Router
提供支援。Router
將向Session Map
請求與 session id相關聯的Node
。當以完全模式啟動Grid,Session Map
是第一個被啟動的組件。
New Session Queuer 新會話隊列者
New Session Queue 新會話隊列
New Session Queuer
是唯一可以與New Session Queue
通訊的組件。它處理所有的隊列操作,例如,像「add」去操作隊列。它提供配置參數設置請求超時和請求重試的間隔。
New Session Queuer
通過Router
接收新會話請求並將其添加到隊列中。Queuer等待直到它收到請求的響應。如果請求超時,請求立刻被拒絕並且不會添加到隊列中。
如果請求的功能在任何已註冊的Node
都不存在,那麼請求立刻被拒絕,客戶端收到響應。
如果請求的功能與任何Node
的slots 匹配,Distributor
將嘗試獲取可用的slots,如果所有slots都很忙,Distributor
將要求Queuer將請求添加到隊列前面。在請求重試間隔後,Distributor
再次接受請求。不停的嘗試重試,直到請求成功或超時。如果請求在重試可添加到隊列前超時,則其被拒絕。
在獲得可用的slots和創建會話之後,Distributor
通過Event Bus
將新會話響應傳遞給New Session Queuer
。New Session Queuer
在接收到事件時響應客戶端。
Event Bus 事件匯流排
Event Bus
匯流排充當Node
、Distributor
、 New Session Queuer
和 Session Map
之間的通訊路徑。Grid通過消息進行大部分的內部通訊,避免了昂貴的HTTP調用。
Role In Grid
在Grid3中,組件分Hub
和Node
, 通過獨立模式下運行Grid,可以將他們放在一起運行。同樣的概念在Grid4中也是可以的。可以通過將上面描述的一些組件分組來運行Hub
,也可以在獨立模式下同時運行所有組件。
Hub
Hub 是以下組件的總合:
· Router
· Distributor
· Session Map
· New Session Queuer
· Event Bus
它支援經典的Hub & Node
的設置。
Standalone
如前所述, Standalone是所有組件的總和。在用戶看來,它們是作為一個組件執行的。這包括作為Hub
的所有組件,以及一個Node
。在Standalone啟動後,可以使用一個功能齊全的Grid。
不同的模運行Grid
- Standalone
- Hub and Node
- Distributed
- Docker
Standalone Mode
一個新的Selenium Server jar 包含了運行Grid的所有內容。它是運行Selenium Grid的最簡單模式。默認情況下,服務監聽//localhost:4444
,你可以在程式中調用RemoteWebDriver
類訪問這個URL進行測試,伺服器從系統路徑中檢測到可用的驅動程式。
- 啟動Selenium server:
> java -jar .\selenium-server-4.0.0-beta-1.jar standalone
18:02:39.622 INFO [LogManager$RootLogger.log] - Using the system default encoding
18:02:39.625 INFO [OpenTelemetryTracer.createTracer] - Using OpenTelemetry for tracing
18:02:43.351 INFO [NodeOptions.report] - Adding Chrome for {"browserName": "chrome"} 16 times
18:02:43.352 INFO [NodeOptions.report] - Adding Firefox for {"browserName": "firefox"} 16 times
18:02:43.812 INFO [Node.<init>] - Binding additional locator mechanisms: id, name
18:02:43.826 INFO [LocalDistributor.add] - Added `node` 40291796-b2da-40a8-8b3a-b20a5c80b65d at //10.2.212.186:4444.
18:02:43.830 INFO [GridModel.setAvailability] - Switching `node` 40291796-b2da-40a8-8b3a-b20a5c80b65d (uri: //10.2.212.186:4444) from DOWN to UP
18:02:45.583 INFO [Standalone.execute] - Started Selenium Standalone 4.0.0-beta-1 (revision Unknown): //10.2.212.186:4444
- 運行腳本(python)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import DesiredCapabilities
dr = webdriver.Remote(command_executor='//127.0.0.1:4444',
desired_capabilities=DesiredCapabilities.CHROME.copy()
)
dr.get("//www.baidu.com")
dr.find_element(By.ID, "kw").send_keys("selenium grid4")
dr.find_element(By.ID, "su").click()
dr.close()
Hub and Node Mode
- 啟動hub
> java -jar .\selenium-server-4.0.0-beta-1.jar hub
- 註冊Node
> java -jar .\selenium-server-4.0.0-beta-1.jar node
在 Selenium 4.0 中,我們還添加了GraphQL,這是一種可以輕鬆查詢必要數據並獲得完全相同數據的新方法。
- 通過HTTPie查詢介面
官網://httpie.io/
以下兩種模式比較複雜一些,也是Grid4真正區別於Grid3的功能,後續再介紹!
- Distributed Mode 分散式模式
- Start Standalone Grid Via Docker Images 通過Docker鏡像啟動Grid