了解了selenium-grid的基本結(jié)構(gòu),再來(lái)看看selenium-grid通信的原理。假設(shè)現(xiàn)在我們有這樣一個(gè)場(chǎng)景:[一個(gè)測(cè)試請(qǐng)求客戶端、一個(gè)hub節(jié)點(diǎn)、一個(gè)Windows+ie代理、一個(gè)linux+FF代理、一個(gè)Mac+Safari代理、一個(gè)任意平臺(tái)下的Chrome代理]。其分布圖如下:
測(cè)試的代碼如下:
import org.openqa.selenium.*;
import org.openqa.selenium.remote.RemoteWebDriver;
import org.openqa.selenium.remote.DesiredCapabilities;
//test01: 只匹配Windows下的ie來(lái)執(zhí)行此用例,版本不限;多個(gè)版本匹配成功時(shí)優(yōu)先級(jí)暫未知
DesiredCapabilities aDesiredcap = DesiredCapabilities();
aDesiredcap.setBrowserName("internet explorer")
aDesiredcap.setVersion("")
aDesiredcap.setPlatform(Platform.WINDOWS)
WebDriver wd = new RemoteWebDriver<span style="font-family: Arial, Helvetica, sans-serif;">("http://localhost:4444/wd/hub", aDesiredcap);</span>
wd.doSomething()
//test02: 只匹配linix下的firefox的版本為22的瀏覽器執(zhí)行用例;
DesiredCapabilities aDesiredcap = DesiredCapabilities("firefox", "22", Platform.LINUX);
WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", aDesiredcap);
wd.doSomething()
//test03: 只匹配MAC下的safari瀏覽器執(zhí)行,版本不限
DesiredCapabilities aDesiredcap = DesiredCapabilities.safari();
aDesiredcap.setPlatform(Platform.MAC)
WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", aDesiredcap);
wd.doSomething()
//test04: 只匹配chrome瀏覽器,任意平臺(tái),任意版本
DesiredCapabilities aDesiredcap = DesiredCapabilities.chrome();
aDesiredcap.setPlatform(Platform.ANY)
WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", aDesiredcap);
wd.doSomething()
那么整個(gè)測(cè)試執(zhí)行的過(guò)程大概是這樣的。首先我們?cè)跍y(cè)試請(qǐng)求機(jī)上執(zhí)行測(cè)試代碼,代碼中測(cè)試啟動(dòng)方式為遠(yuǎn)程調(diào)用;
WebDriver wd = new RemoteWebDriver("http://localhost:4444/wd/hub", aDesiredcap);
此時(shí)測(cè)試腳本會(huì)根據(jù)啟動(dòng)參數(shù)連接hub節(jié)點(diǎn),這里的連接信息為
http://localhost:4444/wd/hub
連接到hub成功后,會(huì)在hub上注冊(cè)一個(gè)session信息;[后面再與hub通信時(shí)會(huì)帶上這個(gè)session信息,告訴hub我之前來(lái)過(guò),并且之前是被分配到哪個(gè)代理節(jié)點(diǎn)上執(zhí)行過(guò)測(cè)試]
hub在接受初始化請(qǐng)求時(shí)會(huì)根據(jù)請(qǐng)求的類型來(lái)匹配所有代理,并確定是否有符合規(guī)則的代理;
如果匹配失敗了會(huì)拒絕該初始請(qǐng)求;如果匹配成功則通知對(duì)應(yīng)代理節(jié)點(diǎn)進(jìn)行對(duì)應(yīng)的初始化操作,這里是啟動(dòng)XX,并記錄瀏覽器的注冊(cè)session,后發(fā)回給hub端;
hub端接收到代理端起的完成后的session信息后,在hub中同樣要記錄session并返回給測(cè)試請(qǐng)求端,[session中會(huì)保存匹配到的代理信息]
在初始化請(qǐng)求成功之后,測(cè)試請(qǐng)求端會(huì)繼續(xù)發(fā)送下一條測(cè)試命令,這里的命令是:
wd.doSomething()
此命令會(huì)同樣被發(fā)送給hub,當(dāng)然是帶上session信息的;
hub接收到帶有session的請(qǐng)求命令時(shí),會(huì)查詢session的信息,得知session中對(duì)應(yīng)的代理后把請(qǐng)求的命令給轉(zhuǎn)發(fā)給該代理;
代理在接收到hub發(fā)送過(guò)來(lái)的測(cè)試命令后,同樣查詢其session信息,并根據(jù)session信息操作與之對(duì)應(yīng)的瀏覽器以執(zhí)行測(cè)試;
測(cè)試完成后會(huì)通知hub執(zhí)行結(jié)果,hub再轉(zhuǎn)發(fā)給測(cè)試請(qǐng)求端,測(cè)試請(qǐng)求端根據(jù)的返回信息來(lái)決定接下來(lái)的執(zhí)行流程;
后測(cè)試結(jié)束后,通知hub關(guān)閉瀏覽器進(jìn)程,同時(shí)清除對(duì)應(yīng)的session信息。
由selenium-grid的原理可以得知
通過(guò)selenium-grid執(zhí)行遠(yuǎn)程操作時(shí),并不需要遠(yuǎn)程機(jī)器上有測(cè)試腳本;但是遠(yuǎn)程機(jī)器上必須安裝了對(duì)應(yīng)的webdriver程序[可以直接放在環(huán)境變量的目錄里即可],當(dāng)然了,還得需要正確的啟動(dòng)了代理程序。[具體可以參考:如何搭建Selenium-Grid環(huán)境]