瀏覽器啟動(dòng)完成后,調(diào)用:driver.get("https://ke.qq.com/");
就能在導(dǎo)航欄中訪問(wèn)到指定的這個(gè)頁(yè)面,這個(gè)里面發(fā)生了什么?
到底是客戶端腳本直接操作瀏覽器還是通過(guò)某些中間件來(lái)完成??
底層原理如下:
1、在自動(dòng)化測(cè)試過(guò)程中,存在三部分組件:客戶端腳本+驅(qū)動(dòng)+瀏覽器終端。
2、驅(qū)動(dòng)文件,以geckodriver.exe為例,這個(gè)可執(zhí)行的驅(qū)動(dòng)文件啟動(dòng)后,相當(dāng)于一個(gè)暴露了一系列接口的服務(wù)器,監(jiān)聽(tīng)某一端口,例如:89890。
3、客戶端的操作(訪問(wèn)頁(yè)面,定位元素,輸入數(shù)據(jù),點(diǎn)擊按鈕等)都是封裝成了接口請(qǐng)求(eg:/session/xx/yy),然后提交到驅(qū)動(dòng)服務(wù)器。
4、驅(qū)動(dòng)服務(wù)器接收到客戶端的請(qǐng)求后,再跟終端瀏覽器交互。
5、終端瀏覽器做出相應(yīng)操作。
下圖描述了整個(gè)交互過(guò)程:
定位元素為例,定位搜索框,我們來(lái)看底下這行代碼在執(zhí)行的時(shí)候底層到底經(jīng)歷了些什么:
實(shí)際,底層請(qǐng)求時(shí),每個(gè)請(qǐng)求會(huì)被封裝為一個(gè)command,然后根據(jù)不同的commannd封裝得到不同的HttpRequest對(duì)象:
根據(jù)此命令,得到接口地址:
拿到此接口地址封裝為一個(gè)HttpRequest請(qǐng)求。
client.execute(httpRequest,true),執(zhí)行接口調(diào)用:
至于其他操作:往輸入框輸入數(shù)據(jù),點(diǎn)擊按鈕等,都是對(duì)應(yīng)一個(gè)接口地址,通過(guò)調(diào)用接口,請(qǐng)求驅(qū)動(dòng)來(lái)處理,最后驅(qū)動(dòng)同瀏覽器進(jìn)行交互,瀏覽器按照指示做出對(duì)應(yīng)操作。
Selenium有一個(gè)類(lèi)AbstractHttpCommandCodec,此類(lèi)中維護(hù)了眾多自動(dòng)化操作對(duì)應(yīng)的接口地址:
另外,可能會(huì)有人好奇,驅(qū)動(dòng)服務(wù)器是何時(shí)啟動(dòng)的服務(wù)。其實(shí)是在執(zhí)行下面這行代碼的時(shí)候啟動(dòng)的,大家可執(zhí)行去debug調(diào)試selenium的底層代碼:
當(dāng)上面這行代碼執(zhí)行完,可以發(fā)現(xiàn)eclipse的控制臺(tái)顯示了如下信息:
說(shuō)明此驅(qū)動(dòng)服務(wù)器成功啟動(dòng)了,并且監(jiān)聽(tīng)了本機(jī)的21984端口,等待客戶端發(fā)起請(qǐng)求,并處理。
至于驅(qū)動(dòng)跟瀏覽器之間是如何交互的,在后面的文章中會(huì)擇機(jī)介紹,請(qǐng)大家守候。