LoadRunner函數學習--web_custom_request及與web_submit_data區別


一、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方法的原型是:
int web_custom_request (const char *RequestName, <List of Attributes>,[EXTRARES, <List of Resource Attributes>,] LAST );其中List of Attributes的主要項目是Method,URL和BODY等.

下面再介紹兩個事例:

/*
腳本名稱:web_custom_request事例
腳本功能:通過登錄WebTours的操作來演示web_custom_request函數的使用
使用的技術:關聯和檢查點
*/

Action()
{
    //定義一個變量,進行判斷是否登錄成功時使用
    int tag=0;

    //對userSession進行關聯
    //  <input type=hidden name=userSession value=110044.482462535fzzAtVDpAzzzzzzHDDQzcptHit>
    web_reg_save_param("userID","LB=<input type=hidden name=userSession value=","RB=>",LAST);


    web_url("WebTours", 
        "URL=http://127.0.0.1:1080/WebTours/", 
        "Resource=0", 
        "RecContentType=text/html", 
        "Referer=", 
        "Snapshot=t1.inf", 
        "Mode=HTML", 
        LAST);

    lr_think_time(9);

    //檢查點設置
    tag=web_reg_find("Text=jojo","Search=ALL",LAST);

    /*利用web_custom_request函數自定義請求*/
    web_custom_request("login.pl",
                       "Method=POST",
                       "URL=http://127.0.0.1:1080/WebTours/login.pl",
                       "Body=userSession={userID}&username=jojo&password=bean&JSFormSubmit=off&login.x=54&login.y=8",
                       LAST);

    if(tag==0)
        lr_output_message("login successful!");
    else
        lr_output_message("login failed");
    /*
    web_submit_form("login.pl", 
        "Snapshot=t2.inf", 
        ITEMDATA, 
        "Name=username", "Value=jojo", ENDITEM, 
        "Name=password", "Value=bean", ENDITEM, 
        "Name=login.x", "Value=54", ENDITEM, 
        "Name=login.y", "Value=8", ENDITEM, 
        LAST);
    */

    web_image("SignOff Button", 
        "Alt=SignOff Button", 
        "Snapshot=t3.inf", 
        LAST);

    lr_output_message("signoff successful");

    return 0;
}
View Code
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;
}
View Code

 

二、LoadRunner中web_custom_request 和 web_submit_data的差別

web_custom_request方法可以發送POST和GET類型的請求

web_submit_data方法只能發送POST類型的請求

所有web_submit_data方法發送的請求都可以使用web_custom_request來實現,web_custom_request可以實現web_submit_data無法實現的請求

比如“查詢所有郵件並刪除”這個案例中,查詢時我們使用關聯把所有郵件對應的標識抓取成一個數組,如果使用web_submit_data來完成這個刪除的請求,需要很多個web_submit_data請求才能完成,但使用web_custom_request就可以通過一個請求完成,方法是自己寫代碼拼一個web_custom_request 方法POST請求的Body值。

web_submit_data請求中提交的數據是以這樣的方式存在的

Name=屬性名稱,,Value=屬性值” 

如:
     “Name=locale”, “Value=L2″, ENDITEM, 
     “Name=dataCenter”, “Value=yh”, ENDITEM, 
     “Name=username”, “Value=12044″, ENDITEM,

 如果我們想提交的某個屬性包含包含多個值(上文的例子中就是這樣的情況),它就無法處理了,只能通過多個web_submit_data來處理。

 下面是一個典型的web_submit_data和web_custom_request請求,可以看到web_custom_request中提交的數據(body)是以這樣的方式存在的

Body=屬性名稱=屬性值&屬性名稱=屬性值&……

    web_submit_data(“login”, 
        “Action=http://192.168.14.21:78……ndex_sso.jsp”, 
        “Method=POST”, 
        “RecContentType=text/html”, 
        “Referer=http://192.168.14.21:7888…=/index_sso.jsp”, 
        “Mode=HTML”, 
        ITEMDATA, 
        “Name=locale”, “Value=L2″, ENDITEM, 
        “Name=dataCenter”, “Value=yh”, ENDITEM, 
        “Name=username”, “Value=12044″, ENDITEM, 
        “Name=password”, “Value=”, ENDITEM, 
        “Name=_eventId”, “Value=submit”, ENDITEM, 
        “Name=isPureWeb”, “Value=true”, ENDITEM, 
        “Name=solutionName”, “Value=eas”, ENDITEM, 
        “Name=dbType”, “Value=1″, ENDITEM, 
        “Name=easSessionId”, “Value=eas;yh;L2;12044;BaseDB”, ENDITEM,        
        “Name=userAuthPattern”, “Value=BaseDB”, ENDITEM, 
        “Name=loginFlow”, “Value=true”, ENDITEM, 
        LAST);

    web_custom_request(“CommonQueryDialog.jsf_3″,
        “URL=http://192.168.14.21:7888/ea…ueryDialog.jsf”,
        “Method=POST”,
        “Resource=0″,
        “RecContentType=text/javascript”,
        “Referer=http://192.168.14.21:7888/…DailyLoanUERc+ihtml”,
        “Mode=HTML”,
        “EncType=application/x-www-form-urlencoded;charset=UTF-8″,
        “Body=queryDialog:selectSolutionList=查詢&queryDialog:j_iduserFilterPanel_3_value=Kd5QoAEPEADgAAf8wKgEDMznrtQ=&=湖南亞華乳業有限公司&queryDialog:j_iduserFilterPanel_6=&queryDialog:j_iduserFilterPanel_9_value=3&=大於等於&queryDialog:j_iduserFilterPanel_11=0&queryDialog:j_iduserFilterPanel_14_value=&=&queryDialog:j_iduserFilterPanel_17_value=&=&queryDialog:j_iduserFilterPanel_20_value=&=&queryDialog:j_iduserFilterPanel_23_value=&=&queryDialog:j_iduserFilterPanel_26_value=&=&queryDialog:j_iduserFilterPanel_29_value=&=&queryDialog:j_iduserFilterPanel_32=&queryDialog:j_iduserFilterPanel_35_value=&=&queryDialog:j_iduserFilterPanel_38=2008-08-01&queryDialog:j_iduserFilterPanel_41=2008-08-28&queryDialog:filterGrid_modifiedData=[]&queryDialog:filterGrid_removedData=[]&queryDialog:_postback=&queryDialog:userFilterPanel=/cp/bc/dailyLoanBillCommQuery.xhtml&javax.faces.ViewState={vs2}”,
        LAST);

通過我的觀察,發現有兩種情況下的POST請求會被LoadRunner錄制為web_custom_request,

1.   上文提到的批量提交多條同屬性名稱的數據的請求
2.   header屬性x-requested-by值為XMLHttpRequest的POST請求

這兩種實現請求的方法還有一個需要注意的地方就是web_custom_request中body中的屬性值如果包含一些特殊字符,必須通過URL編碼,否則Web服務器會返回500錯誤,一個典型的例子是如果Body中包含ViewState,ViewState中常常有“=”之類的特殊字符,此時必須通過URL編碼,LoadRuner中提供了一個這樣的編碼轉換函數

       web_convert_param(“vs1″, “SourceEncoding=HTML”,  “TargetEncoding=URL”, LAST);

除LoadRunner外,你可以在Fiddler中按Ctrl+E來轉換

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM