您好,登錄后才能下訂單哦!
這篇文章是給搜狗測試公眾號投稿的,沒想到落榜了,還是寫在自己的博客吧,畢竟我覺得這個是滿滿的干貨
模擬場景: 腳本實現阻塞請求A,等待N秒之后,自動放行請求A
因為項目的業務邏輯,需要模擬這樣的場景,剛開始我也很糾結郁悶,覺得無從下手,還不如手工來的快一些,因為涉及到時間,又不敢保證每次手工操作的準確性。沒辦法,只能硬著頭皮啃這個大難題,
后來我就把這個問題一步步拆解,化繁為簡,之后再逐漸攻克每一個難點,這樣就在不知不覺中解決了這個疑難雜癥。
思路: 第一問: 如何讓請求阻塞呢?
之前都是在界面上執行命令,bpu * ,bpafter ,怎么用腳本來實現遇到請求A就自動攔截呢?這個我們就要深挖在界面上【QuickExec box】執行命令之后的秘密了。
在CustomRules.js文檔中,會發現如下的代碼:
// The OnExecAction function is called by either the QuickExec box in the Fiddler window,
// or by the ExecAction.exe command line utility.
static function OnExecAction(sParams: String[]): Boolean {
......
//取數組的第一個值,第一個值存放的是執行的命令
var sAction = sParams[0].toLowerCase();
switch (sAction) {
case "bpafter":
var len = sParams.Length ;
//如果sParams 長度小于2,也就意味著bpafter后面沒有跟url,那么就清空bpafter 阻塞的url,下次再遇到此url 就不會再阻塞了
if (sParams.Length<2) {bpResponseURI=null; FiddlerObject.StatusText="ResponseURI breakpoint cleared"; return false;}
var len = sParams.Length ;
//取數組的第二個值,第二個值存放的是要截取的url
bpResponseURI = sParams[1];
FiddlerObject.StatusText="ResponseURI breakpoint for "+sParams[1];
return true;
}
......
}
OnExecAction 這個函數就是在界面上執行命令所調用的函數,sParams 是將輸入的內容用空格分割而成的數組。
例如,bpafter /altamob/zwf ,那么 sParams[0] = "bpafter" ; sParams[1] = "/altamob/zwf" ;
明白了這個操作的原理,如果想阻塞某個請求,只要調用此函數就可以了。
if (oSession.uriContains("A")){
oSession["ui-color"] = "purple";
var command1:String[] = ["bpafter","/altamob/zwf"];
OnExecAction(command1);
}
第二問:如何讓等待N秒呢?
CustomRules.js 是JS 的腳本文檔,我們可以用jS來實現此功能,這個是很常見的代碼。
static function sleep(numberMillis) {
var now = new Date();
var exitTime = now.getTime() + numberMillis;
while (true) {
now = new Date();
if (now.getTime() > exitTime)
return;
}
}
單位是ms,等待2s中,sleep(2000); 這樣調用即可
第三問:如何自動放行呢?
go 命令是放行所有被中斷的會話。關鍵是在哪一步執行此命令呢?
發現了這樣一個被注釋掉的函數
// This function executes after Fiddler finishes processing a Session, regardless
// of whether it succeeded or failed. Note that this typically runs AFTER the last
// update of the Web Sessions UI listitem, so you must manually refresh the Session's
// UI if you intend to change it.
static function OnDone(oSession: Session) {
}
看上面的注解,This function executes after Fiddler finishes processing a Session, regardless of whether it succeeded or failed,
不管一個session 成功或者失敗,在fiddler 結束處理這個session之后,這個函數就會被執行。我的英文翻譯真的是很爛,但是意思是這么個意思,
就是處理完一個session,肯定會調用此函數。那么在此函數中將阻塞放行就ok了。
static function OnDone(oSession: Session) {
if (oSession.uriContains("A")){
sleep(1000);
var command1:String[] = ["go"];
OnExecAction(command1);
}
}
【相關書籍:Fiddler抓包讓數據無處可藏】https://yuedu.baidu.com/ebook/52dc548fe109581b6bd97f19227916888586b950
【相關書籍:玩轉Fiddler】https://yuedu.baidu.com/ebook/2a08ad280a4e767f5acfa1c7aa00b52acfc79cd5
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。