背景:
工时系统项目经理审核工时,使用现网数据测试时,每个项目经理审核的记录条数不确定,脚本中web_submit_data函数实现全部提交需要列出所有的记录数,使用参数化只能实现多个项目经理各自审核相同条数的记录,但使用web_custom_request就用代码拼一个POST请求的Body值实现多个项目经理各自审核不同条数的记录。使用这种方法处理脚本能真实反映服务期的处理能力。
语法:
web_custom_request (const char *RequestName, <List of Attributes>, [EXTRARES, <List of Resource Attributes>,] LAST ); 返回值 参数: List of Attribute:支持的属性有以下几种: 1. URL:页面地址。 2. Method:页面的提交方式,POST或GET。 3. TargetFrame:包含当前链接或资源的frame的名称。参见List of Attributes的同名参数。 4. EncType:编码类型。 5. RecContentType:响应头的内容类型。参见List of Attributes的同名参数。 6. Referer:参见List of Attributes的同名参数。 7. Body:请求体。参见List of Attributes的同名参数。 8. RAW BODY:参见List of Attributes的同名参数。 9. BodyFilePath:作为请求体传送的文件的路径。它不能与下面的属性一起使用:Body,或者其他Body属性或Raw Body属性包括BodyBinary,BodyUnicode,RAW_BODY_START或Binary=1。 10. Resource、ResourceByteLimit、Snapshot、Mode:参见List of Attributes的同名参数。 11. ExtraResBaseDir:参见List of Attributes的同名参数。 12. UserAgent:用户代理,它是一个HTTP头的名字,用来标识应用程序,通常是浏览器,它呈现的是用户和服务器的交互。 |
开工~~
web_custom_request在录制中不一定可以录出来,我们可以通过通过树型模式查看web_submit_data向服务器发送的实际数据,如图1。
web_submit_data脚本如下:
web_submit_data("ApproveDetailManager.jsp_2", "Action=http://192.168.18.31/TimeSheet/Jsp/TimeSheetManage/ApproveDetailManager.jsp", "Method=POST", "TargetFrame=", "RecContentType=text/html", "Referer=http://192.168.18.31/TimeSheet/Jsp/TimeSheetManage/ApproveDetailManager.jsp?menuCode=4_03", "Snapshot=t7.inf", "Mode=HTML", ITEMDATA, "Name=chk0", "Value=on", ENDITEM, "Name=status_code0", "Value=2", ENDITEM, "Name=row_num0", "Value=0", ENDITEM, "Name=employeeId0", "Value=10236", ENDITEM, "Name=chk1", "Value=on", ENDITEM, "Name=status_code1", "Value=2", ENDITEM, "Name=row_num1", "Value=0", ENDITEM, "Name=employeeId1", "Value=16610", ENDITEM, "Name=row_count", "Value=2", ENDITEM, "Name=operateFlag", "Value=approve", ENDITEM, "Name=approve_person_id", "Value=0", ENDITEM, "Name=approve_last_name", "Value=null", ENDITEM, LAST);
|
将ITEMDATA的值转换成Body值为
Body=chk0=on&status_code0=2&row_num0=0&employeeId0=10236&chk1=on&status_code1=2&row_num1=0&employeeId1=16610&row_count=2&operateFlag=approve&approve_person_id=0&approve_last_name=null
使用web_custom_request函数,请求变为
web_custom_request("ApproveDetailManager.jsp", "URL=http://192.168.18.31/TimeSheet/Jsp/TimeSheetManage/ApproveDetailManager.jsp?menuCode=4_03", "Method=POST", "RecContentType=text/html", "Snapshot=t6.inf", “Body=chk0=on&status_code0=2&row_num0=0&employeeId0=10236&chk1=on&status_code1=2&row_num1=0&employeeId1=16610&row_count=2&operateFlag=approve&approve_person_id=0&approve_last_name=null ”, LAST); |
下面的任务则是对body部分的内容进行处理,row_num和employeeId的值需要进行参数化,
chk0=on&status_code0=2&row_num0=0&employeeId0=10236这一条记录内部需要进行参数拼接,多条记录的获取需要进行循环。
1、参数化:
由于row_num和employeeId的值也不太好确定,此处采用注册函数参数化,使用web_reg_save_param获取。
web_reg_save_param("person", "LB/BIN=<input personId=\"", "RB/BIN=\" projectId", "Ord=ALL", "Search=Body", LAST); |
2、循环:
web_reg_save_param获取参数时,将Ord参数值设定为ALL,则关联函数将自动把符合条件的关联值保存到参数数组里。在本例中,关联值返回两条记录,则LR分别将值保存到person_1, person_2中,同时,LR还将自动创建一个person_count变量来保存总的记录数,在这里person_count值等于2。利用这些信息,我们就可以很方便地在循环语句中实现我们的目的了
2.1声明变量,变量大小≈单个大小x300(目前最多不超过300条记录)
int count; int i; char form[20480]; char personvalue[2500]; char personeva[200]; char rowvalue[3500]; char roweva[2000]; char tp[2500]; char tp1[5000]; char tp2[3500]; char tp3[1000]; char tp4[4500]; char tp5[2500]; char tp6[20]; |
2.2将返回的记录数保存到count变量里:
count=atoi(lr_eval_string("{person_count}")); |
2.3使用for循环
for(i=1;i<=count;i++) { sprintf(tp,"chk%d=on",i-1);//把格式化的数据写入tp中 chk0=on
sprintf(tp1,"&status_code%d=2",i-1);//&status_code0=2
sprintf(tp2,"&row_num%d",i-1);//&row_num0
sprintf(rowvalue,"{row_%d}",i); strcpy(roweva,lr_eval_string(rowvalue));//取出row的值,并把值传给roweva sprintf(tp3,"=%s",roweva);//=0
sprintf(tp4,"&employeeId%d",i-1);//&employeeId0
sprintf(personvalue,"{person_%d}",i); strcpy(personeva,lr_eval_string(personvalue));//取出person的值,并把值传给personeva sprintf(tp5,"=%s&",personeva);//= 10236& } |
2.4拼接
strcpy(form,"Body="); sprintf(tp6,"row_count=%s",lr_eval_string("{person_count}"));//row_count=1 strcat(form,tp6);//Body=chk0=on&status_code0=2&row_num0=1&employeeId0=96818&row_count=1 strcat(form,"&operateFlag=approve&approve_person_id=0&approve_last_name=null"); |
2.4打印
lr_output_message("form.的值为%s",form); |
2.5将web_custom_request函数中的body值用变量代替
web_custom_request("ApproveDetailManager.jsp", "URL=http://192.168.18.31/TimeSheet/Jsp/TimeSheetManage/ApproveDetailManager.jsp?menuCode=4_03", "Method=POST", "RecContentType=text/html", "Snapshot=t6.inf", form, LAST); |
2.6打完收工~完整脚本如下,粗体为脚本中修改的部分:
#include "web_api.h" int count; int i; char form[10240]; char personvalue[128]; char personeva[128]; char rowvalue[128]; char roweva[128]; char tp[1024]; char tp1[1024]; char tp2[1024]; char tp3[1024]; char tp4[1024]; char tp5[1024]; char tp6[1024];
Action() { web_submit_data("loginConsole.jsp", "Action=http://192.168.18.31/TimeSheet/loginConsole.jsp?fg=1", "Method=POST", "TargetFrame=", "RecContentType=text/html", "Referer=http://192.168.18.31/TimeSheet/login.jsp", "Snapshot=t2.inf", "Mode=HTML", ITEMDATA, "Name=userCode", "Value={usercode}", ENDITEM, "Name=userPass", "Value=1", ENDITEM, LAST);
web_reg_save_param("person", "LB/BIN=<input personId=\"", "RB/BIN=\" projectId", "Ord=ALL", "Search=Body", LAST); web_reg_save_param("row", "LB/BIN=\" lineNo=\"", "RB/BIN=\"", "Ord=ALL", "Search=Body", LAST);
web_url("工时管理", "URL=http://192.168.18.31/TimeSheet/Jsp/TimeSheetManage/ApproveDetailManager.jsp?menuCode=4_03", "TargetFrame=main", "Resource=0", "RecContentType=text/html", "Referer=http://192.168.18.31/TimeSheet/TabMenu.jsp", "Snapshot=t5.inf", "Mode=HTML", LAST);
strcpy(form,"Body="); count=atoi(lr_eval_string("{person_count}")); for(i=1;i<=count;i++) { sprintf(tp,"chk%d=on",i-1); sprintf(tp1,"&status_code%d=2",i-1);//&status_code0=2
sprintf(tp2,"&row_num%d",i-1);//&row_num0
sprintf(rowvalue,"{row_%d}",i); strcpy(roweva,lr_eval_string(rowvalue)); sprintf(tp3,"=%s",roweva);//=1
sprintf(tp4,"&employeeId%d",i-1);//&employeeId0
sprintf(personvalue,"{person_%d}",i); strcpy(personeva,lr_eval_string(personvalue)); sprintf(tp5,"=%s&",personeva);//=96818&
strcat(form,tp); strcat(form,tp1); strcat(form,tp2); strcat(form,tp3); strcat(form,tp4); strcat(form,tp5); } sprintf(tp6,"row_count=%s",lr_eval_string("{person_count}")); strcat(form,tp6);//Body=chk0=on&status_code0=2&row_num0=1&employeeId0=96818&row_count=1
strcat(form,"&operateFlag=approve&approve_person_id=0&approve_last_name=null");
lr_start_transaction("全部提交");
web_custom_request("ApproveDetailManager.jsp", "URL=http://192.168.18.31/TimeSheet/Jsp/TimeSheetManage/ApproveDetailManager.jsp?menuCode=4_03", "Method=POST", "RecContentType=text/html", "Snapshot=t6.inf", form, LAST);
lr_end_transaction("全部提交", LR_AUTO);
return 0; } |