項目中需要對“商品信息”進行查詢及導出,但是loadrunner並不能錄制到“保存”這一操作。
項目介紹:flex+Http協議;
不能錄制的原因:
在我們點擊了“導出”按鈕后,服務端已經生成一份我們需要的文件,之后的“另存為”也是一個下載功能,但是保存到本地的操作是本地讀寫操作,由於loadrunner是基於協議的,所以錄制不到該操作。
處理步驟:
(1)根據錄制到的web_url()請求,對其中的URL進行參數化;
(2)根據flex_amf_call獲取服務端返回的數據;
(3)C的一系列文件操作進行本地寫操作;
實例:
本次錄制到的下載路徑(在web_url函數中)為:http://192.168.1.1/erp/excel/excel2007.do?number=******&abc=******;在導出操作對應的flex_amf_call函數的XMLTreeEditor中獲取到的下載請求為:excel/excel2007.do?number=16091410574050259539,如下所示。
看到這里,我意識到自己需要利用C的字符串處理函數,將Response的數據string提取處理,這里使用 lr_xml_get_values函數完成。
同時也注意到,最終的URL帶有“abc=******”的字樣,考慮到是不是和查詢到的商品有關,於是在商品查詢相關flex的返回中尋找答案,結果找了半天都無結果,最后詢問開發,才知道這只是一個隨機數(⊙﹏⊙)b,為了防止從緩存中讀取數據使導出的數據不正確,也是醉了,看來溝通還是非常重要的。。。
明白了URL的處理,接下來就是獲取到需要下載的excel文件,在web_url請求前添加 web_reg_save_param獲取下載的內容,可以使用log輸出觀察是否正確。
最后使用 fwrite寫入本地。
Export
{
char *comparename = "excel/excel2007.do?number=";
char new_exporturl[200] = "http://192.168.1.1/erp/excel/excel2007.do?number=";
char exportname[100];
int flen;
int time;
char file[200] = "D:\\LRTest\\ERP_GoodsManage\\download\\"; //下載文件的保存路徑;
long filedes; //保存文件句柄
lr_start_transaction("export");
flex_amf_call(
"AMF3_call_11",
"Gateway=http://192.168.1.1/erp/messagebroker/amf{CorrelationParameter_1}",
"Snapshot=t133.inf",
"ResponseParameter=response",
//省略該請求詳細信息***********
LAST);
lr_xml_get_values("XML={response}",
"Query=/AMFPacket[1]/Messages[1]/Message[1]/AMF3[1]/object-externalizable-custom[1]/flex.messaging.messages.AcknowledgeMessageExt[1]/string[1]/text()", //使用loadrunner——》XMlTreeEditor中的Get_Path功能獲取路徑,比較重要,還不會自己寫。
"ValueParam=exporturl",
LAST);
lr_output_message("exporturl = %s", lr_eval_string("{exporturl}"));
if( 0 == strncmp(lr_eval_string ("{exporturl}"),comparename,26)) //驗證number取值是否正確
{
lr_end_transaction("export", LR_PASS);
}
else
{
lr_end_transaction("export", LR_FAIL);
}
strcpy( exportname,lr_eval_string("{exporturl}")+26); //指針偏移26次,也可以使用指針相減計算偏移
lr_output_message("exportname = %s", exportname);
strcat( new_exporturl,exportname );
lr_output_message("new_exporturl = %s", new_exporturl);
strcat( new_exporturl,"&abc=0.9799411464482546" ); //不再隨機產生
lr_output_message("new_exporturl = %s", new_exporturl);
lr_save_string( new_exporturl,"new_exporturl" );
web_set_max_html_param_len("10480");//大小設定為1M
web_reg_save_param("filecontent",
"LB=",
"RB=",
"Ord=1",
"Search=BODY",
LAST);
lr_start_transaction("download");
web_url("excel2007.do",
"URL={new_exporturl}",
"Resource=1",
"RecContentType=application/octet-stream",
"Referer=http://192.168.1.1/erp/erp-flex-ria-1.0.20160909164625.swf",
"Snapshot=t134.inf",
LAST);
// lr_output_message("filecontent :", lr_eval_string("{filecontent}"));
strcat(file,exportname );
strcat(file,".xlsx" );
//獲取文件下載大小
flen =web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);
lr_output_message("下載文件大小是 %d KB", flen / 1024);
lr_user_data_point( "flen",flen ); //添加了自定義數據采集,為了場景中觀察而已,與execl下載無關
time = web_get_int_property(HTTP_INFO_DOWNLOAD_TIME);
lr_output_message("下載時間是 %d 毫秒", time);
lr_user_data_point( "time",time ); //同上
if (flen)
{
if(NULL == (filedes = fopen(file,"wb")))
{
lr_output_message("Open FileFailed:", lr_eval_string("{filecontent}"));
return -1;
}
fwrite( lr_eval_string("{filecontent}"),flen,1,filedes );
fclose( filedes );
lr_end_transaction("download", LR_PASS);
}
else
{
lr_end_transaction("download", LR_FAIL);
}
// lr_end_transaction("download", LR_AUTO);
return 0;
}
備注:當未定義下載文件的保存路徑 file 時,在fopen中使用導出文件的名稱exportname作為導出的path參數,即fopen(exportname,"wb"),此時默認的文件導出路徑為腳本的工作路徑;