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…%3D%2Findex_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%2Bihtml”, “Mode=HTML”, “EncType=application/x-www-form-urlencoded;charset=UTF-8″, “Body=queryDialog%3AselectSolutionList=%E6%9F%A5%E8%AF%A2&queryDialog%3Aj_iduserFilterPanel_3_value=Kd5QoAEPEADgAAf8wKgEDMznrtQ%3D&=%E6%B9%96%E5%8D%97%E4%BA%9A%E5%8D%8E%E4%B9%B3%E4%B8%9A%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8&queryDialog%3Aj_iduserFilterPanel_6=&queryDialog%3Aj_iduserFilterPanel_9_value=3&=%E5%A4%A7%E4%BA%8E%E7%AD%89%E4%BA%8E&queryDialog%3Aj_iduserFilterPanel_11=0&queryDialog%3Aj_iduserFilterPanel_14_value=&=&queryDialog%3Aj_iduserFilterPanel_17_value=&=&queryDialog%3Aj_iduserFilterPanel_20_value=&=&queryDialog%3Aj_iduserFilterPanel_23_value=&=&queryDialog%3Aj_iduserFilterPanel_26_value=&=&queryDialog%3Aj_iduserFilterPanel_29_value=&=&queryDialog%3Aj_iduserFilterPanel_32=&queryDialog%3Aj_iduserFilterPanel_35_value=&=&queryDialog%3Aj_iduserFilterPanel_38=2008-08-01&queryDialog%3Aj_iduserFilterPanel_41=2008-08-28&queryDialog%3AfilterGrid_modifiedData=%5B%5D&queryDialog%3AfilterGrid_removedData=%5B%5D&queryDialog%3A_postback=&queryDialog%3AuserFilterPanel=%2Fcp%2Fbc%2FdailyLoanBillCommQuery.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來轉換