国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
揭秘webdriver實(shí)現(xiàn)原理 | 乙醇的開源自動(dòng)化工具研究Blog

揭秘webdriver實(shí)現(xiàn)原理

通過研究selenium-webdriver的源碼,筆者發(fā)現(xiàn)其實(shí)webdriver的實(shí)現(xiàn)原理并不高深莫測無法揣度。在這里以webdriver ruby bindingfirefox-webdriver實(shí)現(xiàn)為例,簡單介紹一下webdriver的工作原理。

  • 當(dāng)測試腳本啟動(dòng)firefox的時(shí)候,selenium-webdriver 會(huì)首先在新線程中啟動(dòng)firefox瀏覽器。如果測試腳本指定了firefox的profile,那么就以該profile啟動(dòng),否則的話就新啟1個(gè)profile,并啟動(dòng)firefox;

  • firefox一般是以-no-remote的方法啟動(dòng),啟動(dòng)后selenium-webdriver會(huì)將firefox綁定到特定的端口,綁定完成后該firefox實(shí)例便作為webdriver的remote server存在;

  • 客戶端(也就是測試腳本)創(chuàng)建1個(gè)session,在該session中通過http請(qǐng)求向remote server發(fā)送restful的請(qǐng)求,remote server解析請(qǐng)求,完成相應(yīng)操作并返回response;

  • 客戶端接受response,并分析其返回值以決定是轉(zhuǎn)到第3步還是結(jié)束腳本;

這就是webdriver的工作流程,看起來很復(fù)雜實(shí)際上當(dāng)了解了webdriver的實(shí)現(xiàn)原理后,理解上述問題應(yīng)該比較簡單。

webdriver是按照server – client的經(jīng)典設(shè)計(jì)模式設(shè)計(jì)的。

server端就是remote server,可以是任意的瀏覽器。當(dāng)我們的腳本啟動(dòng)瀏覽器后,該瀏覽器就是remote server,它的職責(zé)就是等待client發(fā)送請(qǐng)求并做出相應(yīng);

client端簡單說來就是我們的測試代碼,我們測試代碼中的一些行為,比如打開瀏覽器,轉(zhuǎn)跳到特定的url等操作是以http請(qǐng)求的方式發(fā)送給被測試瀏覽器,也就是remote server;remote server接受請(qǐng)求,并執(zhí)行相應(yīng)操作,并在response中返回執(zhí)行狀態(tài)、返回值等信息;

舉個(gè)實(shí)際的例子,下面代碼的作用是”命令”firefox轉(zhuǎn)跳到google主頁:

driver = Selenium::WebDriver.for :firefoxdriver.navigate.to "http://google.com"

在執(zhí)行driver.navigate.to “http://google.com” 這句代碼時(shí),client,也就是我們的測試代碼向remote server發(fā)送了如下的請(qǐng)求:

POST session/285b12e4-2b8a-4fe6-90e1-c35cba245956/urlpost_data {"url":"http://google.com"} 

通過post的方式請(qǐng)求localhost:port/hub/session/session_id/url地址,請(qǐng)求瀏覽器完成跳轉(zhuǎn)url的操作。

如果上述請(qǐng)求是可接受的,或者說remote server是實(shí)現(xiàn)了這個(gè)接口,那么remote server會(huì)跳轉(zhuǎn)到該post data包含的url,并返回如下的response

{"name":"get","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":""}

該response中包含如下信息

  • name:remote server端的實(shí)現(xiàn)的方法的名稱,這里是get,表示跳轉(zhuǎn)到指定url;

  • sessionId:當(dāng)前session的id;

  • status:請(qǐng)求執(zhí)行的狀態(tài)碼,非0表示未正確執(zhí)行,這里是0,表示一切ok不許擔(dān)心;

  • value:請(qǐng)求的返回值,這里返回值為空,如果client調(diào)用title接口,則該值應(yīng)該是當(dāng)前頁面的title;

如果client發(fā)送的請(qǐng)求是定位某個(gè)特定的頁面元素,則response的返回值可能是這樣的:

{"name":"findElement","sessionId":"285b12e4-2b8a-4fe6-90e1-c35cba245956","status":0,"value":{"ELEMENT":"{2192893e-f260-44c4-bdf6-7aad3c919739}"}}

name,sessionId,status跟上面的例子是差不多的,區(qū)別是該請(qǐng)求的返回值是ELEMENT:{2192893e-f260-44c4-bdf6-7aad3c919739},表示定位到元素的id,通過該id,client可以發(fā)送如click之類的請(qǐng)求與server端進(jìn)行交互。

那么remote server端的這些功能是如何實(shí)現(xiàn)的呢?答案是瀏覽器實(shí)現(xiàn)了webdriver的統(tǒng)一接口,這樣client就可以通過統(tǒng)一的restful的接口去進(jìn)行瀏覽器的自動(dòng)化操作。目前webdriver支持ie, chrome, firefox, opera等主流瀏覽器,其主要原因是這些瀏覽器實(shí)現(xiàn)了webdriver約定的各種接口。

具體見http://code.google.com/p/selenium/wiki/JsonWireProtocol#Command_Reference。

由于筆者能力有限才疏學(xué)淺,因此文中定然有些謬誤之處,還望不吝指出,多多斧正之。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
WebDriver入門及提高
WebDriver拾級(jí)而上·之零 WebDriver理論
Selenium2 python自動(dòng)化39-關(guān)于面試的題
Selenium for C#的入門Demo
Selenium Remote Control發(fā)布0.90版 - [Matrix - 與 ...
用Python Selenium完成Chrome的自動(dòng)化操作詳解
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服