Selenium 4.0beta: Grid 工作原理

蟲師發表於2021-03-04

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的最簡單模式。預設情況下,服務監聽http://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 http://10.2.212.186:4444.
18:02:43.830 INFO [GridModel.setAvailability] - Switching `node` 40291796-b2da-40a8-8b3a-b20a5c80b65d (uri: http://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): http://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='http://127.0.0.1:4444',
                      desired_capabilities=DesiredCapabilities.CHROME.copy()
                      )
dr.get("https://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查詢介面

官網:https://httpie.io/

以下兩種模式比較複雜一些,也是Grid4真正區別於Grid3的功能,後續再介紹!

  • Distributed Mode 分散式模式
  • Start Standalone Grid Via Docker Images 通過Docker映象啟動Grid

相關文章