web_custom_request應用示例-飛機訂票系統中的刪票操作



LoadRunner提供的web_custom_request函數可以用於實現參數的動態生成。在LoadRunner中,web_reg_save_param和custom_request都常於處理參數的動態生成。

web_reg_save_param函數是大家都已經熟悉的了,它的主要作用是從一個response中獲得後續的request需要使用的數據,然後將其作爲一個參數保存下來,供後續步驟使用。該方法在LoadRunner中被稱爲Correlation(關聯)。

而web_custom_request函數則可以用於完全自定義向服務端發送的request。

接下來我們用一個實際的例子說明一下web_custom_request的具體應用:

以Mercury自帶的MercuryWebTours例子爲例,假設我們希望在登錄進入後將用戶的前兩條記錄刪除,我們來看看用web_custom_request如何實現這個目標。

首先,我們嘗試用HTML方式對該操作進行錄製。錄製後的腳本中與刪除相關的部分大致如下:

web_url("welcome.pl",
    
"URL=http://localhost/MercuryWebTours/welcome.pl?page=itinerary"
,
        
"Resource=0"
,
        
"RecContentType=text/html"
,
    
"Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=home"
,
    
"Snapshot=t3.inf"
,
    
"Mode=HTML"
,
    EXTRARES,
    
"URL=images/in_itinerary.gif""Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary"
, ENDITEM,
    
"URL=images/home.gif""Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary"
, ENDITEM,
        LAST);
lr_think_time(
2
);

web_submit_form(
"itinerary.pl"
,
    
"Snapshot=t4.inf"
,
    ITEMDATA,
    
"Name=1""Value=on"
, ENDITEM,
    
"Name=2""Value=on", ENDITEM,        "Name=removeFlights.x""Value=116"
, ENDITEM,
    
"Name=removeFlights.y""Value=8"
, ENDITEM,
    LAST);

我們通過樹型模式查看一下在submit form的時候實際向服務器發出的請求的內容:

從請求內容中可以看到,我們通過POST方法發出了請求,請求發送的目的URL是/MercuryWebTours/itinerary.pl,發送的內容是:
"1=on&flightID=384-798-JM&2=on&flightID=3026-1592-JM&3=on&flightID=1194-2326-JM&.cgifields=1&.c"
"gifields=2&.cgifields=3&removeFlights.x=116&removeFlights.y=8"

從發送的內容中可以很明顯的分析得出,1=on表示第一個checkbox是被選中的,flightID=384-798-JM表示的是第一條記錄所對應的flightID。因此,如果我們需要自己組成這個發送的request的話,必須首先通過關聯的方式獲得前兩條記錄的flightID,然後再組成request的內容。

web_custom_request方法的原型是:
int web_custom_request (const char *RequestName, <List of Attributes>,[EXTRARES, <List of Resource Attributes>,] LAST );

其中List of Attributes的主要項目是Method,URL和BODY等。對這個例子來說,我們可以很容易構造出我們需要的request的BODY內容。
……
 strcpy(creq, "Body=1=on&flightID=");
 strcat(creq, lr_eval_string("{fID1}"));
 strcat(creq, "&2=on&flightID=");
 strcat(creq, lr_eval_string("{fID2}"));
 strcat(creq, "&.cgifields=1&.cgifields=2");
 strcat(creq, "&removeFlights.x=116&removeFlights.y=8");
……

其中{fID1}、{fID2}等都是通過關聯獲得的flightID的數據。

因此,我們可以根據圖中的數據編寫custom_request語句:

web_custom_request("itinerary.pl",
"Method=POST"

    
"URL=http://localhost/MercuryWebTours/itinerary.pl"
,
    
"RecContentType=text/xml"
,
    creq,
    
"Snapshot=t4.inf"
,
    LAST);

較爲完整的代碼如下:
Action()
{
    
char creq[500
];

    web_reg_save_param(
"fID1""LB=INPUT TYPE=\"hidden\" NAME=\"flightID\" VALUE=\"""RB=\"""ORD=1"

        
"SEARCH=BODY"
, LAST);
    web_reg_save_param(
"fID2""LB=INPUT TYPE=\"hidden\" NAME=\"flightID\" VALUE=\"""RB=\"""ORD=2"

        
"SEARCH=BODY"
, LAST);
    web_url(
"welcome.pl"
,
        
"URL=http://localhost/MercuryWebTours/welcome.pl?page=itinerary"
,
        
"Resource=0"
,
        
"RecContentType=text/html"
,
        
"Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=home"
,
        
"Snapshot=t3.inf"
,
        
"Mode=HTML"
,
        EXTRARES,
        
"URL=images/in_itinerary.gif""Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary"
, ENDITEM,
        
"URL=images/home.gif""Referer=http://localhost/MercuryWebTours/nav.pl?page=menu&in=itinerary"
, ENDITEM,
        LAST);
    lr_think_time(
2
);

    strcpy(creq, 
"Body=1=on&flightID="
);
    strcat(creq, lr_eval_string(
"{fID1}"
));
    strcat(creq, 
"&2=on&flightID="
);
    strcat(creq, lr_eval_string(
"{fID2}"
));
    strcat(creq, 
"&.cgifields=1&.cgifields=2"
);
    strcat(creq, 
"&removeFlights.x=116&removeFlights.y=8"
);

    lr_output_message(creq);

    web_custom_request(
"itinerary.pl"
,
"Method=POST"

        
"URL=http://localhost/MercuryWebTours/itinerary.pl"
,
        
"RecContentType=text/xml"
,
        creq,
        
"Snapshot=t4.inf"
,
        LAST);

    
return 0
;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章