微信公眾號:程式員小濠
關注可了解更多的測驗技術,問題或建議,請添加微信好友;
如果你覺得公眾號對你有幫助,歡迎推薦給他人
一、Selenium Grid 簡介
Selenium Grid是Selenium套件的一部分,它專門用于并行運行多個測驗用例在不同的瀏覽器、作業系統和機器上,
通過將客戶端命令發送到遠程瀏覽器的實體, Selenium Grid 允許在遠程計算機 (虛擬或真實) 上執行WebDriver腳本. 它旨在提供一種在多臺計算機上并行運行測驗的簡便方法.
Selenium Grid允許我們在多臺計算機上并行運行測驗, 并集中管理不同的瀏覽器版本和瀏覽器配置 (而不是在每個獨立的測驗中).
Selenium Grid通過使用多臺機器并行運行測驗來加速測驗通過的執行,例如,如果你有一個包含100個測驗的套件,但是你將 Grid 設定為支持4個不同的機器(vm 或單獨的物理機器)來運行這些測驗,那么您的測驗套件完成的時間大約是在單臺機器上順序運行測驗的時間的四分之一,對于大型測驗套件和長時間運行的測驗套件(如執行大量資料驗證的測驗套件) ,這可以大大節省時間,有些測驗套件可能需要幾個小時才能運行,增加運行套件所需時間的另一個原因是縮短開發人員為 UAT 簽入代碼后測驗結果的周轉時間,越來越多的軟體團隊在實踐敏捷軟體開發測驗,他們希望盡可能快地得到測驗反饋,而不是等待一夜之間的測驗通過,
Selenium Grid還用于支持針對多個運行時環境(特別是同時針對不同的瀏覽器)運行測驗,例如,可以設定一個虛擬機的網格,每個網格支持不同的瀏覽器,而被測驗的應用程式必須支持這些瀏覽器,所以,1號機器有 Internet Explorer 8,2號機器,Internet Explorer 9,3號機器是最新的 Chrome,4號機器是最新的 Firefox,當測驗套件運行時,Selenium-Grid 接收每個測驗-瀏覽器組合,并分配每個測驗在其所需的瀏覽器上運行,
此外,你可以擁有一個Grid,它包含所有相同的瀏覽器、型別和版本,例如,可以有一個由4臺計算機組成的網格,每臺計算機運行3個 Firefox 70實體,從某種意義上來說,允許一個可用 Firefox 實體的“服務器場”,當套件運行時,每個測驗都被傳遞給 Grid,Grid 將測驗分配給下一個可用的 Firefox 實體,通過這種方式,可以想象12個測驗同時并行運行,從而大大減少了完成測驗通過所需的時間,
Grid是非常靈活的,這兩個示例可以組合在一起,以允許每個瀏覽器型別和版本的多個實體,這樣的配置既可以提供快速測驗通過完成的并行執行,也可以同時支持多種瀏覽器型別和版本,
總結:Selenium Grid就是一款分布式的,用于兼容性測驗和并發性測驗的框架或者工具,
二、Selenium Gird的目的和主要功能
-
為所有的測驗提供統一的入口
-
管理和控制運行著瀏覽器的節點/環境
-
擴展
-
并行測驗
-
跨平臺(作業系統)測驗
-
負載測驗
三、Selenium Grid 組件
1.Client:客戶端
2.Router:路由,負責將請求轉發到正確的組件,它是Grid的入口點,所有的外部請求都會被它接收到,根據請求的不同,Router的行為也不同,如果是一個新的會話請求,路由器將把它轉發給新的會話佇列,它將把它添加到新的會話佇列中,新的會話佇列將通過事件總線觸發事件,分發服務器(將在其中處理新會話創建)將接收事件并輪詢新會話佇列以獲取新會話請求,如果請求屬于現有會話,那么Router將會話id發送給Session Map,Session Map將回傳運行會話的Node,然后,路由器將請求轉發給節點,
3.Session Map:會話映射,會話映射是一個資料存盤,用于保存會話id和會話運行的節點的資訊,在向節點轉發請求的程序中,它充當了對Router的支持,路由器將向會話映射詢問與會話id關聯的節點,
4.Session Queue:會話佇列,新建會話佇列是唯一可以與新建會話佇列通信的組件,它處理所有佇列操作,比如添加操作佇列,它具有用于設定請求超時和請求重試間隔的可配置引數,
5.Distributor:分布式,分發服務器知道所有節點及其功能,它的主要作用是接收一個新的會話請求,并找到一個合適的節點,在那里可以創建會話,創建會話后,分發服務器在會話映射中存盤會話id和執行會話的節點之間的關系,
6.Nodes:節點,一個節點可以在一個網格中多次出現,每個Node負責管理運行它的計算機的可用瀏覽器的插槽,節點通過事件總線將自身注冊到分發服務器,其配置作為注冊訊息的一部分發送,默認情況下,Node自動注冊其運行的計算機路徑上的所有可用瀏覽器驅動程式,它還為基于Chromium的瀏覽器和Firefox每個可用CPU創建一個插槽,對于 Safari和google Internet Explorer,只創建一個插槽,通過特定的配置,它可以在Docker容器中運行會話,您可以在下一節中看到更多的配置細節,Node只執行接收到的命令,它不評估、判斷或控制任何事情,運行Node的計算機不需要具有與其他組件相同的作業系統,例如,一個Windows Node可能有能力提供一個瀏覽器選項,而這在 Linux或Mac上是不可能的Internet Explorer,
7.Event Bus:事件總線,事件總線充當節點、分發服務器、新會話排隊器和會話映射之間的通信路徑,網格通過訊息完成大部分內部通信,避免了昂貴的 HTTP 呼叫,當以完全分布式模式啟動網格時,事件總線是應該啟動的第一個組件,

四、Selenium Grid配置
1.獨立模式
默認情況下,服務器會監聽本地4444埠,也就是http://localhost:4444,這就是你應該指向RemoteWebDriver測驗的 URL,服務器將檢測它可以從系統路徑中使用的可用驅動程式,
java -jar selenium-server-standalone-3.5.3.jar standalone
2.Hub和Node節點模式
# 啟動hub
java -jar selenium-server-standalone-3.5.3.jar hub
# 注冊一個節點
java -jar selenium-server-standalone-3.5.3.jar node --detect-drivers true
3.分布式模式
Step1.首先,啟動事件總線,它在后續步驟中充當到其他Grid組件的通信路徑,
java -jar selenium-server-standalone-3.5.3.jar event-bus
Step2.啟動會話映射,它負責將會話 id 映射到會話運行的節點
java -jar selenium-server-standalone-3.5.3.jar sessions
Step3.啟動新的會話佇列,它將新的會話請求添加到本地佇列中,分發服務器從佇列中接收請求,
java -jar selenium-server-standalone-3.5.3.jar sessionqueue
Step4.啟動分發服務器,所有節點都作為分發行程的一部分附加,當呼叫創建會話請求時,它負責分配節點,
java -jar selenium-server-standalone-3.5.3.jar distributor --sessions http://localhost:5556 --sessionqueue http://localhost:5559 --bind-bus false
Step5.啟動路由器,這是一個你要暴露給網路的地址
java -jar selenium-server-standalone-3.5.3.jar router --sessions http://localhost:5556 --distributor http://localhost:5553 --sessionqueue http://localhost:5559
Step6.添加一個節點
java -jar selenium-server-standalone-3.5.3.jar node --detect-drivers true
4.Docker模式
你可以通過以下命令啟動一個節點:
java -jar selenium-server-standalone.3.5.3.jar node -D selenium/standalone-firefox:latest '{"browserName": "firefox"}'
你可以啟動 Selenium 服務器,并將其委托給 docker 以創建新實體:
java -jar selenium-server-standalone-3.5.3.jar standalone -D selenium/standalone-firefox:latest '{"browserName": "firefox"}' --detect-drivers false
五、配置組件
1.配置幫助和概述
java -jar selenium-server-standalone-3.5.3.jar info config
2.設定安全
# 獲取構建網格服務器的詳細資訊, 用于安全通信和節點注冊.
java -jar selenium-server-standalone-3.5.3.jar info security
3.會話設定
# 默認情況下, 網格使用本地會話表來存盤會話資訊. 網格支持額外的存盤選項, 比如Redis和JDBC-SQL支持的資料庫. 要設定不同的會話存盤, 請使用以下命令獲取設定步驟
java -jar selenium-server-standalone-3.5.3.jar info sessionmap
4.默認情況下,啟用了跟蹤,要匯出跟蹤并通過 Jaeger 可視化它們
java -jar selenium-server-standalone-3.5.3.jar info tracing
5.列出 Selenium Grid 命令
java -jar selenium-server-standalone-3.5.3.jar --config-help
6.組件幫助命令
#Standalone
java -jar selenium-server-standalone-3.5.3.jar standalone --help
#Hub
java -jar selenium-server-standalone-3.5.3.jar hub --help
#Session
java -jar selenium-server-standalone-3.5.3.jar sessions --help
#New Session Queuer
java -jar selenium-server-standalone-3.5.3.jar sessionqueuer --help
#Distributor
java -jar selenium-server-standalone-3.5.3.jar distributor --help
#Router
java -jar selenium-server-standalone-3.5.3.jar router --help
#Node
java -jar selenium-server-standalone-3.5.3.jar node --help
六、Selenium Grid啟動
1.selenium下載,本文測驗環境如下:
-
hub:Mac os
-
Node:Windows 10
-
Chrome瀏覽器版本:91.0.4472.164(正式版本)(64 位)
-
Chrome瀏覽器驅動版本:91.0.4472.101
2.selenium3.5下載鏈接:
http://selenium-release.storage.googleapis.com/index.html?path=3.5/
3.chromedriver.exe下載鏈接:
http://npm.taobao.org/mirrors/chromedriver/91.0.4472.101/
4.服務器啟動Hub服務
java -jar selenium-server-standalone-3.5.3.jar -role hub


3.客戶端注冊Node
java -jar selenium-server-standalone-3.5.3.jar -role node -port 5555 -hub http://192.168.20.31:4444/grid/register -maxSession 5 -browser browserName=chrome,seleniumProtocol=WebDriver,maxInstances=5

說明:-role node:表示注冊Node節點-port 5555:表示注冊的Node節點的埠號是5555-hub http://192.168.20.31:4444/grid/register:表示將注冊的Node節點注冊到hub上,注意,hub和Node機器必須在同一局域網內-maxSession:最大會話請求,請要用于并發執行測驗腳本:表示注冊的Node節點的埠號是5555-browser browserName=chrome,seleniumProtocol=WebDriver,maxInstances=5:瀏覽器型別,驅動及同一版本的瀏覽器可以在遠程系統上運行多少個實體
4.查看服務端狀態


七、Selenium Grid腳本撰寫
1.將下載好的chromedriver.exe放到Chrome瀏覽器根目錄,或者配置成環境變數
2.創建一個Maven專案
3.pom.xml中加入Selenium依賴
<dependencies>
<!-- http://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-server -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-server</artifactId>
<version>3.5.3</version>
</dependency>
</dependencies>
import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.Platform;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.openqa.selenium.remote.RemoteWebDriver;
import java.net.MalformedURLException;
import java.net.URL;
/**
* @author 作者:測驗工程師成長之路
* @version 創建時間:2021/7/24
* 類說明:Selenium Grid
*/
public class SeleniumGridTest {
public static final String browserName = "chrome";
@Test
public void test() throws InterruptedException {
try {
// System.setProperty("webdriver.chrome.driver","D:\\software\\selenium\\chromedriver.exe");
DesiredCapabilities capability = new DesiredCapabilities();
capability.setBrowserName(browserName);
capability.setPlatform(Platform.WINDOWS);
WebDriver driver = new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capability);
driver.get("http://www.baidu.com");
driver.manage().window().maximize();
Thread.sleep(3000);
//輸入mrjade查詢
driver.findElement(By.id("kw")).sendKeys("mrjade" + Keys.ENTER);
Thread.sleep(3000);
// 點擊mrjade-博客園,進入mrjade博客首頁
driver.findElement(By.xpath("//*[@id=\"1\"]/h3/a")).click();
Thread.sleep(5000);
driver.close();
driver.quit();
} catch (
MalformedURLException e) {
e.printStackTrace();
}
}
}
八、后續
我們經過測驗發現,運行此代碼后會隨機在某個Node上面運行測驗用例,也就是打開瀏覽器等一系列操作,因為我們是要做分布式測驗或者說是兼容性測驗,我們在運行測驗腳本的時候如何同時讓所有Node都運行測驗用例呢?請期待下次分享,
最后為方便大家學習測驗,特意給大家準備了一份13G的超實用干貨學習資源,涉及的內容非常全面,

包括,軟體學習路線圖,50多天的上課視頻、16個突擊實戰專案,80余個軟體測驗用軟體,37份測驗檔案,70個軟體測驗相關問題,40篇測驗經驗級文章,上千份測驗真題分享,還有2021軟體測驗面試寶典,還有軟體測驗求職的各類精選簡歷,希望對大家有所幫助……
關注我公眾號:【程式員小濠】即可獲取這份資料了!
如果你不想再體驗一次自學時找不到資料,沒人解答問題,堅持幾天便放棄的感受的話,可以加入我們的群:175317069 大家一起討論交流,里面也有各種軟體測驗資料和技術交流,
好文推薦
5年經驗之談:月薪3000到30000,測驗工程師的變“行”記!
測驗工程師,自動化測驗工程師,測驗開發工程師,這三個崗位分別需要掌握哪些能力和技術堆疊?
不要讓毒雞湯毀了你,35歲的測驗員沒有那么可怕,保持專注更重要
如果對你有幫助的話,點個贊收個藏,給作者一個鼓勵,也方便你下次能夠快速查找,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/290592.html
標籤:其他
