Selenium 4.0beta: Grid 工作原理

Selenium 4.0 beta版已經發布,那麼距離正式版已經不遠了,在Selenium 4.0中變化比較大的就是Grid了,本文翻譯了官方文檔,重點介紹Grid 4的工作原理

Selenium Grid3工作原理

Hub

  1. 中介和管理
  2. 接受運行測試的請求
  3. 從客戶端獲取指令並在節點上遠程執行它們
  4. 管理執行緒

Hub是發送所有測試的中心點。每個selenium Grid恰好由一個Hub組成。Hub需要能夠從各自的客戶端(即CI伺服器、開發人員機器等)訪問。Hub將連接一個或多個Node測試的節點。

Node

  1. Node和執行的瀏覽器在同一台主機。
  2. 將自己註冊到Hub上,並保持通訊。
  3. 接收來自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來創建會話。DistributorSession Map 中存儲session id和正在執行會話的Node之間的關係。

Node 節點

一個Node可以在Grid中多次創建。每個Node負責管理運行所在機器的可用瀏覽器。

Node通過 Event BusDistributor註冊。它的配置作為註冊消息的一部分發送。

默認情況下,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 QueuerNew Session Queuer在接收到事件時響應客戶端。

Event Bus 事件匯流排

Event Bus 匯流排充當NodeDistributorNew Session QueuerSession Map之間的通訊路徑。Grid通過消息進行大部分的內部通訊,避免了昂貴的HTTP調用。

Role In Grid

在Grid3中,組件分HubNode, 通過獨立模式下運行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
Tags: