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方式對該操作進行錄製。錄製後的腳本中與刪除相關的部分大致如下:
"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語句:
"Method=POST",
"URL=http://localhost/MercuryWebTours/itinerary.pl",
"RecContentType=text/xml",
creq,
"Snapshot=t4.inf",
LAST);
較爲完整的代碼如下:
{
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;
}