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的最簡單模式。預設情況下,服務監聽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查詢介面
以下兩種模式比較複雜一些,也是Grid4真正區別於Grid3的功能,後續再介紹!
- Distributed Mode 分散式模式
- Start Standalone Grid Via Docker Images 通過Docker映象啟動Grid