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

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

  我們寫完了了清除session后,再來寫下保存接口信息的腳本,也很簡單保存為D_interface.exe:
Example()
Func Example()
Local $parment=$CmdLine[1];接受控制臺數(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時(雖然不太可能出現(xiàn)這種情況),執(zhí)行dump命令會彈出個對話框,這時候要關(guān)閉對話框!如果不關(guān)閉的話下面對fiddler的操作會出現(xiàn)問題,因為這時候彈出框是fiddler的窗口,可能導(dǎo)致腳本中使用Enter鍵無效...
  其次,由于python調(diào)用控制臺啟動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ù)。對應(yīng)于上文我們AutoIt腳本中的$parment參數(shù)(由控制臺輸入)。
  上面我們的準(zhǔn)備工作的做的差不多了,總結(jié)一下,干了下面的幾個事情:
  1.用AutoIt生成了清除Fiddler session的一個exe
  2.用AutoIt生成了保存Fiddler session的一個exe
  3.修改了Fiddler的Script接受一個保存session路徑的一個參數(shù)
  在完成了以上工作后,我們來進(jìn)行測試!注意:在此之前我們要明白一些事情:
  1.用Fiddler做代理后,可能影響接口的加載速度,畢竟有個第三者。但是我覺得速度影響在web自動化上不是那么重要的事情,畢竟現(xiàn)實中的訪問速度肯定比你公司內(nèi)部訪問速度更差。(缺點之一)
  2.用Fiddler做代理后,我們知道在訪問https的時候比如訪問百度,可能顯示非安全鏈接,我們平常的做法是把fiddler的證書導(dǎo)入瀏覽器(具體百度上有說明),但是我們webdriver啟動的是個空白的瀏覽器,如何能自動加載Fiddler證書?
  3.用Fiddler做代理后,如果Fiddler崩潰或者沒啟動起來造成無法聯(lián)網(wǎng)導(dǎo)致所有腳本無法運(yùn)行,這個風(fēng)險我們?nèi)绾我?guī)避?
  第一個問題跳過,我們看看第二個問題:
  在路徑C:Python27Libsite-packagesseleniumwebdriverfirefoxfirefox_profile.py下定義了一個FirefoxProfile類,這個類我們平時可能不太用的上,但是用不上不代表他不重要,這個類是個管理瀏覽器插件的類。我們說明一下:
  1.其構(gòu)造函數(shù)傳火狐瀏覽器的插件路徑。火狐瀏覽器的插件一般在C:Users***AppDataRoamingMozillaFirefoxProfiles****.default-*****"這個路徑下面。構(gòu)造函數(shù)會把這個路徑下的東西copy到c:\users\pf-211x3\appdata\local\temp\***\webdriver-py-profilecopy這個文件夾下。
  2.encoded函數(shù)。這個函數(shù)的文檔屬性這樣解釋:"A zipped, base64 encoded string of profile directory for use with remote WebDriver JSON wire protocol"具體很么意思呢?是這個函數(shù)會把上文中我們提到的c:\users\pf-211x3\appdata\local\temp\***\webdriver-py-profilecopy這個文件夾壓縮成ZIP格式文件,然后對這個文件進(jìn)行base64的編碼,當(dāng)啟動瀏覽器的時候,會將這個編碼一同發(fā)給服務(wù)器,服務(wù)器再對他base64解碼、解壓縮將您本地火狐插件完完整整的復(fù)制到新啟動的空白瀏覽器上,那么我們新啟動的瀏覽器擁有了本地瀏覽器所有的插件了。
  3.set_preference。傳遞一個鍵值對,是設(shè)置火狐瀏覽器的選項,比如設(shè)置代理等等....
  4.add_extension。傳遞一個***.xpi的路徑,是設(shè)置瀏覽器加載的插件,比如啟動瀏覽器加載firebug,把firebug插件路徑傳遞給add_extension即可
  經(jīng)過我對FirefoxProfile類的說明,您大概知道了問題二的解決辦法了吧,對的是向FirefoxProfile類中傳遞插件的路徑。但是C:Users***AppDataRoamingMozillaFirefoxProfiles****.default-*****"這個文件是比較大的反正我的是50M,將這樣一個大的文件經(jīng)過步驟2的操作,是個費(fèi)事費(fèi)力的事情。所以你們會發(fā)現(xiàn),如果把完整的插件路徑傳遞給FirefoxProfile,經(jīng)過一系列的壓縮、傳遞,啟動本地瀏覽器會非常非常慢!經(jīng)過排除和嘗試法,我發(fā)現(xiàn)火狐對證書的控制是由插件文件夾下的cert8.db控制的,所有我們把這個文件給拷貝出來放在一個文件夾中,單獨傳這個文件夾路徑即可。

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