您的位置:軟件測(cè)試 > 開源軟件測(cè)試 > 開源功能測(cè)試工具 > Selenium
如何記錄Selenium自動(dòng)化測(cè)試過程中接口的調(diào)用信息
作者:不再有的年月 發(fā)布時(shí)間:[ 2017/4/13 13:43:43 ] 推薦標(biāo)簽:Selenium 功能測(cè)試 自動(dòng)化測(cè)試

  上一篇博客,我寫了python自動(dòng)化框架的一些知識(shí)和粗淺的看法,在上一篇中我也給自己提出一個(gè)需求:如果記錄在測(cè)試過程中接口的調(diào)用情況?提出這個(gè)需求,我覺得是有意義的。你在測(cè)試過程中肯定會(huì)遇到一些莫名其妙的問題,比如:web某個(gè)頁(yè)面一直在刷進(jìn)度條,導(dǎo)致你定位元素失敗,但是,你再手動(dòng)操作一遍可能無(wú)法復(fù)現(xiàn)....對(duì)于我們來(lái)說,肯定會(huì)遇到許多類似的問題。你會(huì)發(fā)現(xiàn)有時(shí)候僅僅靠一張截圖,你遠(yuǎn)遠(yuǎn)找不到bug的原因。這時(shí)候,我在想如果我能拿到這一系列操作所調(diào)用的接口信息多好,我能明白為什么發(fā)生這種問題了。比如一直在刷進(jìn)度條我覺得有幾種情況:
  1.后端一直在等待某個(gè)接口的響應(yīng)信息。
  2.網(wǎng)絡(luò)原因?qū)е,接口響?yīng)很慢(局域網(wǎng)一般很少出現(xiàn)這類問題)、
  3.前端工程師沒有動(dòng)態(tài)的把這個(gè)進(jìn)度條display="None"....不論何種原因,我拿到相關(guān)的接口信息,能對(duì)錯(cuò)誤逐個(gè)排除。比如我發(fā)現(xiàn)某個(gè)接口的響應(yīng)時(shí)間很長(zhǎng).....或者所有接口的響應(yīng)的時(shí)間多是大于1s的,又或者都正常響應(yīng),原來(lái)js沒有動(dòng)態(tài)改變進(jìn)度的屬性?反正無(wú)論如何我拿到自動(dòng)化操作的接口信息是沒有壞處的吧?(小小的缺點(diǎn)我后面提到)
  那么問題是,我們?nèi)绾蔚哪玫竭@些信息?我開始的想法是通過firebug去拿,firebug我們平時(shí)用的也比較多,可以方便的看到控制臺(tái)信息(js的執(zhí)行情況)和網(wǎng)絡(luò)信息(接口調(diào)用情況),但是我查了很多資料都沒有辦法完整的把這些信息給導(dǎo)出來(lái)....但是,我很快的想到了Fiddler。Fiddler是目前為止我用的好順手的一款http抓包工具(不要和我提什么wireshark,雖然經(jīng)過網(wǎng)卡的信息它都能抓但是僅對(duì)http協(xié)議來(lái)說,真不如fiddler牛逼,誰(shuí)用誰(shuí)知道),更重要的是由于它是個(gè)代理服務(wù)器,所以能抓任何設(shè)置其為代理的終端,包括手機(jī)...想到這,心中一陣竊喜。下面我先說說思路,然后再詳細(xì)的說明,我是怎么做的。我的思路如下:
  1.設(shè)置fiddler過濾一下抓取信息,如:只抓取host為:*.csdn.net的接口信息。
  2.測(cè)試執(zhí)行開始前,打開fiddler。
  3.當(dāng)執(zhí)行一個(gè)test時(shí),先在fiddler控制臺(tái)輸入cls,清空當(dāng)前sessions,防止接口信息過多或混在一起不方便排查錯(cuò)誤。
  4.當(dāng)執(zhí)行test完畢,如果有錯(cuò)誤,則保存此test執(zhí)行過程中的所有sessions至一個(gè)文件夾。無(wú)錯(cuò)誤不做操作(如果你非要保存也是可以的)
  5.重復(fù)2-3的步驟,直至所有測(cè)試結(jié)束。
  6.測(cè)試執(zhí)行結(jié)束后,關(guān)閉fiddler。
  上面的想法,其實(shí)也是很簡(jiǎn)單的,我們?cè)僖粋(gè)個(gè)看看如何實(shí)現(xiàn):
  對(duì)于步驟1/2/5  用python調(diào)用控制臺(tái)打開fiddler是有問題的(主進(jìn)程會(huì)阻塞,其他應(yīng)用程序沒問題),改用AutoIt的run方法,關(guān)閉沒問題。
  對(duì)于3/4是要想想辦法的。對(duì)于自動(dòng)化人員來(lái)說AutoIt您應(yīng)該是接觸過了,如果沒有去看看吧!AutoIt有弊端有優(yōu)點(diǎn),大的優(yōu)點(diǎn)是編寫簡(jiǎn)單、腳本能轉(zhuǎn)換成exe.大的缺點(diǎn):windows非標(biāo)準(zhǔn)控件無(wú)法獲取。萬(wàn)幸的是Fiddler的控制臺(tái)輸入框能被AutoIt識(shí)別!還有是如何改寫Fiddler的Scripts。(我們的需求很簡(jiǎn)單,別被嚇到了)
  所以第一步:我們編寫清除fiddler session的腳本,轉(zhuǎn)換成C_interface.exe。腳本簡(jiǎn)單到不能簡(jiǎn)單了,如下:
Example()
Func Example()
Local $hWnd = WinWait("[Title:Telerik Fiddler Web Debugger]", "", 10)
WinActivate($hWnd);激活當(dāng)前窗口
ControlFocus($hWnd, "","[CLASS:WindowsForms10.EDIT.app.0.141b42a_r6_ad1;NAME:txtExec]")
ControlSetText($hWnd, "", "[CLASS:WindowsForms10.EDIT.app.0.141b42a_r6_ad1;NAME:txtExec]","cls")
Send("{ENTER}")
EndFunc  ;
  照顧一下,剛開始看AutoIt的同學(xué),Title中的Telerik Fiddler Web Debugger與ControlFocus中的CLASS、NAME是通過AutoIt Window info這個(gè)工具捕捉的,我們的可能不一樣貼圖一張:

  我們寫完了了清除session后,再來(lái)寫下保存接口信息的腳本,也很簡(jiǎn)單保存為D_interface.exe:
Example()
Func Example()
Local $parment=$CmdLine[1];接受控制臺(tái)數(shù)據(jù),$parment為fiddler接口保存路徑
Local $hWnd = WinWait("[Title:Telerik Fiddler Web Debugger]", "", 10)
WinActivate($hWnd);激活當(dāng)前窗口
ControlFocus($hWnd, "","[CLASS:WindowsForms10.EDIT.app.0.141b42a_r6_ad1;NAME:txtExec]")
ControlSetText($hWnd, "", "[CLASS:WindowsForms10.EDIT.app.0.141b42a_r6_ad1;NAME:txtExec]","dump "&$parment)
Send("{ENTER}")
IF WinActive("[Title:Cannot Save SAZ]") Then
ControlClick("[Title:Cannot Save SAZ]","","Button1")
EndIf
EndFunc ;
  標(biāo)紅部分的解釋是:當(dāng)Fiddler沒有session時(shí)(雖然不太可能出現(xiàn)這種情況),執(zhí)行dump命令會(huì)彈出個(gè)對(duì)話框,這時(shí)候要關(guān)閉對(duì)話框!!如果不關(guān)閉的話下面對(duì)fiddler的操作會(huì)出現(xiàn)問題,因?yàn)檫@時(shí)候彈出框是fiddler的窗口,可能導(dǎo)致腳本中使用Enter鍵無(wú)效...
  其次,由于python調(diào)用控制臺(tái)啟動(dòng)Fiddler有問題(具體問題原因未知),所以我們也用AutoIt編寫,并轉(zhuǎn)換成S_interface.exe:
  Example()
  Func Example()
  Local $parment=$CmdLine[1]
  Run($parment)
  EndFunc   ;
  后,我們改下Fiddler的Script的,從菜單的Rules->Customer Rules打開腳本剪輯器,直接拉到script的末端修改方法OnExecAction如下:
......
case "dump":
UI.actSelectAll();
var bpMethod = sParams[1]
//UI.actSaveSessionsToZip(CONFIG.GetPath("Captures") + "dump.saz");
UI.actSaveSessionsToZip(bpMethod)
FiddlerObject.StatusText = "Dumped all sessions to " +bpMethod;
//FiddlerObject.alert(bpMethod);
UI.actRemoveAllSessions();
return true;
  修改case 'dump'的情況,bpMethod是由命令bump空格后的參數(shù)。對(duì)應(yīng)于上文我們AutoIt腳本中的$parment參數(shù)(由控制臺(tái)輸入)。
  上面我們的準(zhǔn)備工作的做的差不多了,總結(jié)一下,干了下面的幾個(gè)事情:
  1.用AutoIt生成了清除Fiddler session的一個(gè)exe
  2.用AutoIt生成了保存Fiddler session的一個(gè)exe
  3.修改了Fiddler的Script接受一個(gè)保存session路徑的一個(gè)參數(shù)
  在完成了以上工作后,我們來(lái)進(jìn)行測(cè)試!注意:在此之前我們要明白一些事情:
  1.用Fiddler做代理后,可能影響接口的加載速度,畢竟有個(gè)第三者。但是我覺得速度影響在web自動(dòng)化上不是那么重要的事情,畢竟現(xiàn)實(shí)中的訪問速度肯定比你公司內(nèi)部訪問速度更差。(缺點(diǎn)之一)
  2.用Fiddler做代理后,我們知道在訪問https的時(shí)候比如訪問百度,可能顯示非安全鏈接,我們平常的做法是把fiddler的證書導(dǎo)入瀏覽器(具體百度上有說明),但是我們webdriver啟動(dòng)的是個(gè)空白的瀏覽器,如何能自動(dòng)加載Fiddler證書?
  3.用Fiddler做代理后,如果Fiddler崩潰或者沒啟動(dòng)起來(lái)造成無(wú)法聯(lián)網(wǎng)導(dǎo)致所有腳本無(wú)法運(yùn)行,這個(gè)風(fēng)險(xiǎn)我們?nèi)绾我?guī)避?
  第一個(gè)問題跳過,我們看看第二個(gè)問題:
  在路徑C:Python27Libsite-packagesseleniumwebdriverfirefoxfirefox_profile.py下定義了一個(gè)FirefoxProfile類,這個(gè)類我們平時(shí)可能不太用的上,但是用不上不代表他不重要,這個(gè)類是個(gè)管理瀏覽器插件的類。我們說明一下:
  1.其構(gòu)造函數(shù)傳火狐瀏覽器的插件路徑;鸷鼮g覽器的插件一般在C:Users***AppDataRoamingMozillaFirefoxProfiles****.default-*****"這個(gè)路徑下面。構(gòu)造函數(shù)會(huì)把這個(gè)路徑下的東西copy到c:\users\pf-211x3\appdata\local\temp\***\webdriver-py-profilecopy這個(gè)文件夾下。
  2.encoded函數(shù)。這個(gè)函數(shù)的文檔屬性這樣解釋:"A zipped, base64 encoded string of profile directory for use with remote WebDriver JSON wire protocol"具體很么意思呢?是這個(gè)函數(shù)會(huì)把上文中我們提到的c:\users\pf-211x3\appdata\local\temp\***\webdriver-py-profilecopy這個(gè)文件夾壓縮成ZIP格式文件,然后對(duì)這個(gè)文件進(jìn)行base64的編碼,當(dāng)啟動(dòng)瀏覽器的時(shí)候,會(huì)將這個(gè)編碼一同發(fā)給服務(wù)器,服務(wù)器再對(duì)他base64解碼、解壓縮將您本地火狐插件完完整整的復(fù)制到新啟動(dòng)的空白瀏覽器上,那么我們新啟動(dòng)的瀏覽器擁有了本地瀏覽器所有的插件了。
  3.set_preference。傳遞一個(gè)鍵值對(duì),是設(shè)置火狐瀏覽器的選項(xiàng),比如設(shè)置代理等等....
  4.add_extension。傳遞一個(gè)***.xpi的路徑,是設(shè)置瀏覽器加載的插件,比如啟動(dòng)瀏覽器加載firebug,把firebug插件路徑傳遞給add_extension即可
  經(jīng)過我對(duì)FirefoxProfile類的說明,您大概知道了問題二的解決辦法了吧,對(duì)的是向FirefoxProfile類中傳遞插件的路徑。但是C:Users***AppDataRoamingMozillaFirefoxProfiles****.default-*****"這個(gè)文件是比較大的反正我的是50M,將這樣一個(gè)大的文件經(jīng)過步驟2的操作,是個(gè)費(fèi)事費(fèi)力的事情。所以你們會(huì)發(fā)現(xiàn),如果把完整的插件路徑傳遞給FirefoxProfile,經(jīng)過一系列的壓縮、傳遞,啟動(dòng)本地瀏覽器會(huì)非常非常慢!經(jīng)過排除和嘗試法,我發(fā)現(xiàn)火狐對(duì)證書的控制是由插件文件夾下的cert8.db控制的,所有我們把這個(gè)文件給拷貝出來(lái)放在一個(gè)文件夾中,單獨(dú)傳這個(gè)文件夾路徑即可。

上一頁(yè)12下一頁(yè)
軟件測(cè)試工具 | 聯(lián)系我們 | 投訴建議 | 誠(chéng)聘英才 | 申請(qǐng)使用列表 | 網(wǎng)站地圖
滬ICP備07036474 2003-2017 版權(quán)所有 上海澤眾軟件科技有限公司 Shanghai ZeZhong Software Co.,Ltd