web_custom_request函数实例

上一篇 / 下一篇  2013-12-19 14:22:48 / 个人分类:Loadruner

背景:

工时系统项目经理审核工时,使用现网数据测试时,每个项目经理审核的记录条数不确定,脚本中web_submit_data函数实现全部提交需要列出所有的记录数,使用参数化只能实现多个项目经理各自审核相同条数的记录,但使用web_custom_request就用代码拼一个POST请求的Body值实现多个项目经理各自审核不同条数的记录。使用这种方法处理脚本能真实反映服务期的处理能力。

语法:

web_custom_request (const char *RequestName, <List of Attributes>,

  [EXTRARES, <List of Resource Attributes>,] LAST );

返回值
返回LR_PASS0)代表成功,LR_FAIL1)代表失败。

参数:
RequestName
:步骤的名称,VuGen中树形视图中显示的名称。

List of Attribute:支持的属性有以下几种:

1. URL:页面地址。

2. Method:页面的提交方式,POSTGET

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属性包括BodyBinaryBodyUnicodeRAW_BODY_STARTBinary=1

10. ResourceResourceByteLimitSnapshotMode:参见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_numemployeeId的值需要进行参数化,

chk0=on&status_code0=2&row_num0=0&employeeId0=10236这一条记录内部需要进行参数拼接,多条记录的获取需要进行循环。

1、参数化:

由于row_numemployeeId的值也不太好确定,此处采用注册函数参数化,使用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.5web_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;

}

说明:lr_save_string函数返回脚本中的一个参数当前的值,C的变量不能直接在LR

TAG:

引用 删除 mimey   /   2017-01-05 18:22:45
5
L~~心~~R的个人空间 引用 删除 L~~心~~R   /   2016-05-23 18:10:14
5
 

评分:0

我来说两句

日历

« 2024-05-20  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 22143
  • 日志数: 17
  • 建立时间: 2007-06-06
  • 更新时间: 2017-06-12

RSS订阅

Open Toolbar