Selenium 4.0beta: Grid 工做原理

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

Selenium Grid3工做原理

Hubnode

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

Hub是發送全部測試的中心點。每一個selenium Grid剛好由一個Hub組成。Hub須要可以從各自的客戶端(即CI服務器、開發人員機器等)訪問。Hub將鏈接一個或多個Node測試的節點。python

Nodeweb

  1. Node和執行的瀏覽器在同一臺主機。
  2. 將本身註冊到Hub上,並保持通訊。
  3. 接收來自Hub的請求並執行他們。

Node是在單個計算機系統上執行測試的不一樣的Selenium實例。Grid中能夠有許多節點。做爲Node的機器不須要與Hub或其餘Node的平臺相同,也不須要具備相同的瀏覽器選擇。Windows上的節點能夠提供Internet Explorer做爲瀏覽器選項,而這在Linux或Mac上是不可能的。chrome

selenium Grid4

Router 路由器shell

路由器負責將請求轉發到正確的組件。瀏覽器

他是Grid的入口點,接收全部外部的請求。路由器行爲的不一樣依賴於接受的請求。服務器

若是是一個新的會話請求,路由器會把它發送給New Session Queuer,將其添加到New Session Queue, New Session queuer經過Event Bus觸發一個事件。Distributor(處理新的會話建立的位置)將會接收事件並輪詢新Session Queue來得到新會話請求。session

若是請求屬於已存在的會話, 路由器發送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
相關文章
相關標籤/搜索