Selenium 4.0 beta版已經發布,那麼距離正式版已經不遠了,在Selenium 4.0中變化比較大的就是Grid了,本文翻譯了官方文檔,重點介紹Grid 4的工做原理java
Hubnode
Hub是發送全部測試的中心點。每一個selenium Grid剛好由一個Hub組成。Hub須要可以從各自的客戶端(即CI服務器、開發人員機器等)訪問。Hub將鏈接一個或多個Node
測試的節點。python
Nodeweb
Node是在單個計算機系統上執行測試的不一樣的Selenium實例。Grid中能夠有許多節點。做爲Node的機器不須要與Hub或其餘Node的平臺相同,也不須要具備相同的瀏覽器選擇。Windows上的節點能夠提供Internet Explorer做爲瀏覽器選項,而這在Linux或Mac上是不可能的。chrome
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
來建立會話。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。
Standalone Mode
一個新的Selenium Server jar 包含了運行Grid的全部內容。它是運行Selenium Grid的最簡單模式。默認狀況下,服務監聽http://localhost:4444
,你能夠在程序中調用RemoteWebDriver
類訪問這個URL進行測試,服務器從系統路徑中檢測到可用的驅動程序。
> 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
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
> java -jar .\selenium-server-4.0.0-beta-1.jar hub
> java -jar .\selenium-server-4.0.0-beta-1.jar node
在 Selenium 4.0 中,咱們還添加了GraphQL,這是一種能夠輕鬆查詢必要數據並得到徹底相同數據的新方法。
如下兩種模式比較複雜一些,也是Grid4真正區別於Grid3的功能,後續再介紹!