LoadRunner常用函数
- 前言
- 常用函数详解
- 1.web_url
- 2. web_submit_data
- 3. web_custom_request
- 4. 事务函数 lr_start_transaction, lr_end_transaction
- 5. 关联函数 web_reg_save_param
- 6.web_reg_find
- 7.atoi
- 8.lr_eval_string
- 9.lr_save_string
- 10.lr_convert_string_encoding
- 11.字符串处理函数
- 12.消息输出函数
- 13.集合点函数
- 14.web_concurrent_start、int web_concurrent_end
- 15.URL编码函数 web_convert_param
- 16.lr_save_var截取任意字符串长度
- 17.web_add_auto_header 自动在每个请求上添加请求头
- 18.web_add_header添加请求头
- 19.flex_amf_call flex协议请求函数
- 20. lr_xml_get_values xml格式数据获取
- 21.web_service_call webservice协议请求函数
- 22.lr_paramarr_random 从关联参数中随机取值
- 23.web_set_max_html_param_len("1024");
- 24.lr_save_datetime("%Y%m%d%H%M%S",DATE_NOW,"timenow");
- 25、web_get_int_property获取返回数据大小
- 脚本编写注意点
前言
LR脚本编写是性能测试的第一步,而脚本是由各个函数组成,所以掌握LR常用函数是关键。
LR脚本是否正确的验证方法:
1、回放过程中没有报错信息;
2、回放结束后查看菜单View>Test Results记录;
3、是否实现系统业务,如新增数据。
常用函数详解
1.web_url
函数说明:加载由URL参数指定的Web页面(GET请求)的动作函数。
int web_url( const char *StepName, const char *url, , [EXTRARES,
,] LAST );
参数说明:
StepName:图形脚本中步骤的标签。也用作自动事务的事务名称。
URL:要加载的网页的URL(统一资源定位符)。
Listof Attributes:属性列表。
EXTRARES:一个分界参数,指示下一个参数将是资源属性列表。
Listof Resource Attributes:资源属性列表。
LAST:指示参数列表结束的标记。
属性列表支持的属性说明:
URL:页面地址。
Method:页面的提交方式,POST、GET、PATCH、PUT等。
TargetFrame:当前链接或资源所在Frame的名称。
EncType:编码类型。此参数给出一个内容类型(Content-Type),指定其做为回放脚本时“Content-Type”请求头的值,例如 “text/html”。
RecContentType:响应头的内容类型。
Referer:当前页面关联的页面。
Body(目前仅适用与web_custom_request函数):请求体。
RAW BODY(目前仅适用与web_custom_request函数):请求体是作为指针传递的,此指针指向一串数据。 二进制的请求体可以使用BodyBinary 属性来发送(或者使用Body 属性来传递,前提是必须设置”Binary=1” )。
BodyFilePath:作为请求体传送的文件的路径。它不能与下面的属性一起使用:Body,或者其他Body属性或Raw Body属性包括BodyBinary,BodyUnicode,RAW_BODY_START或Binary=1。
Mode:两种录制级别HTML、HTTP。
HTML级别:在当前Web界面上录制直观的HTML动作。以一步步的web_url、web_link、web_image、web_submit_form来录制这些动作。VuGen仅仅录制返回HTML页面的请求,不处理脚本和应用程序。
HTTP级别:VuGen把所有的请求录制为web_url指令,不生成web_link、web_image、web_submit_form这些函数。这种方法更为灵活,但是生成的脚本不够直观。
UserAgent:用户代理,它是一个HTTP头的名字,用来标识应用程序,通常是浏览器,它呈现的是用户和服务器的交互。
ContentEncoding:指定请求体的使用指定的方式(gzip或者deflate)进行编码(例如,压缩),相应的“Content-Encoding:” HTTP头会和此请求一起发送。这个参数适用于web_custom_request和web_submit_data。
例子(访问人员背审系统的链接):
web_url("rybs", //步骤名称,网页最后单词
"URL=http://192.168.5.132:8083/rybs", //请求页面地址
"TargetFrame=", //当前连接资源的frame名称
"Resource=0", //url是否为资源,0不是,1是
"RecContentType=text/html", //内容类型
"Referer=", //当前页面关联的页面
"Snapshot=t2.inf", //页面快照名称
"Mode=HTML", //录制模式
EXTRARES,
"Url=http://192.168.2.56:9080/didsserver/css/dragon.css", "Referer=http://192.168.2.56:9080/didsserver/login?service=http%3A%2F%2F192.168.5.132%3A8083%2Frybs%2Flogin.do%3Fmethod%3DloginDids%26forwardUrl%3D%2Fmain.jsp&appId=350000000000003&loginName=&loginPage=&redirectUrl=http%3A%2F%2F192.168.5.132%3A8083%2Frybs%2F&forwardUrl=/main.jsp", ENDITEM,
"Url=http://192.168.2.56:9080/didsserver/images/dragon/loginBg_DIDS.jpg", "Referer=http://192.168.2.56:9080/didsserver/login?service=http%3A%2F%2F192.168.5.132%3A8083%2Frybs%2Flogin.do%3Fmethod%3DloginDids%26forwardUrl%3D%2Fmain.jsp&appId=350000000000003&loginName=&loginPage=&redirectUrl=http%3A%2F%2F192.168.5.132%3A8083%2Frybs%2F&forwardUrl=/main.jsp", ENDITEM,
LAST);
2. web_submit_data
函数说明:处理无状态或者上下文无关的表单提交。只能发送POST类型的请求。
int web_submit_data( const char *StepName, const char *Action, , ITEMDATA,
, [ EXTRARES,
,] LAST );
参数说明:
StepName:图形脚本中步骤的标签。也用作自动事务的事务名称。
Action:提交数据时要执行的操作的HTTP地址。
List of Attributes:属性列表。
ITEMDATA:在属性和数据字段列表之间分隔的标记。
List of Data:用于定义表单提交的数据字段列表。
EXTRARES:一个分界参数,指示下一个参数将是资源属性列表。
Listof Resource Attributes:资源属性列表。
LAST:指示参数列表结束的标记。
例子(人员背审登录请求):
web_submit_data("login", //步骤名称,网页最后单词
"Action=http://192.168.2.56:9080/didsserver/login?service=http%3A%2F%2F192.168.5.132%3A8083%2Frybs%2Flogin.do%3Fmethod%3DloginDids%26forwardUrl%3D%2Fmain.jsp&appId=350000000000003&loginName=&loginPage=&redirectUrl=http%3A%2F%2F192.168.5.132%3A8083%2Frybs%2F&forwardUrl=/main.jsp", //提交地址
"Method=POST", //请求方式
"TargetFrame=", //当前连接资源的frame名称
"RecContentType=text/html", //内容类型
"Referer=http://192.168.2.56:9080/didsserver/login?service=http%3A%2F%2F192.168.5.132%3A8083%2Frybs%2Flogin.do%3Fmethod%3DloginDids%26forwardUrl%3D%2Fmain.jsp&appId=350000000000003&loginName=&loginPage=&redirectUrl=http%3A%2F%2F192.168.5.132%3A8083%2Frybs%2F&forwardUrl=/main.jsp", //页面地址
"Snapshot=t3.inf", //页面快照名称
"Mode=HTML",
ITEMDATA, //ITEMDATA之前为请求的地址和类型等,之后的为提交的表单数据。
"Name=username", "Value=admin_fj", ENDITEM,
"Name=password", "Value=000000", ENDITEM,
"Name=lt", "Value={lt}", ENDITEM,
"Name=_eventId", "Value=submit", ENDITEM,
"Name=x", "Value=12", ENDITEM,
"Name=y", "Value=19", ENDITEM,
EXTRARES,
"Url=http://192.168.5.132:8083/favicon.ico", "Referer=", ENDITEM,
LAST);
3. web_custom_request
函数说明:用于自定义http请求的“万能”函数,具有web_link()、web_url()、web_submit_data()函数的功能,可以发送POST和GET类型的请求。
int web_custom_request( const char *RequestName, ,
[EXTRARES, ,] LAST );
参数说明:
RequestName:图形脚本中步骤的标签。也用作自动事务的事务名称。
List of Attributes:属性列表。
List of Attributes支持的属性EncType:编码类型。此参数给出一个内容类型(Content-Type),指定其做为回放脚本时“Content-Type”请求头的值,例如“text/html”。
Web_custom_request函数不处理未编码的请求体。请求体参数将会使用已经指定的编码方式。因此,如果指定了不匹配HTTP请求体的“EncType”,会引发服务端的错误。通常我们建议不要手动修改录制时的“EncType”值。
任何对于“EncType”的指定都会覆盖web_add_[auto_]header函数指定的Content-Type。当指定了“EncType=”(空值)时,不会产生“Content-Type” 请求头。当省略了“EncType”时,任何一个web_add_[auto_]header函数都会起作用。如果既没有指定EncType也没有web_add_[auto_]header函且“Method=POST”,
“application/x-www-form-urlencoded”会做为默认值来使用。其他情况下,不会产生Content-Type请求头。
EXTRARES:一个分界参数,指示下一个参数将是资源属性列表。
Listof Resource Attributes:资源属性列表。
LAST:指示参数列表结束的标记。
例子(接口请求):
GET请求(公司微信博饼接口请求):
web_custom_request("web_custom_request",
"URL=http://bobing.dragonit.com.cn/activity/bobing/run2.php",
"Method=GET",
"Resource=0",
"Referer=",
"Mode=HTTP",
"Body=",
LAST);
POST请求:
//手写脚本
web_custom_request("web_custom_request",
"URL=http://1.1.20.3:8080/ISS20/rest/api/main/", //页面地址
"Method=POST",//页面的提交方式
"Resource=0", //url是否为资源,0不是,1是
"Referer=",//当前页面关联的页面
"Mode=HTTP",//请求方式
"Body=interfaceCode=SP_CTM_LOGIN&access_token=NEb3DUK4oobyL9FgcgVxUDcAdaPB2buv&busContsCode=&app=&pageCount=&ctmUsrKey=&verifyCode=&cookieKey=&pageSize=&domainName=3&newPwd=&oldPwd=&content=&authcode=&totalCount=&email=&pageNo=&clientIp=1.1.6.12&totalPage=&loginPwd=123456&mobile=&loginName=13720892693", //接口参数/参数值
LAST);
//录制脚本
web_custom_request("SystemInfoPage.do_10",
"URL=http://192.168.5.110:8050/cat/common/SystemInfoPage.do",
"Method=POST",
"Resource=0",
"RecContentType=text/html",
"Referer=http://192.168.5.110:8050/cat/MenuPage.do",
"Snapshot=t316.inf",
"Mode=HTTP",
"EncType=application/x-www-form-urlencoded; charset=UTF-8",
"Body=__EventSource=doAjax&__EventParam=%7B%22method%22%3A%22loadBm%22%2C%22params%22%3A%5B%22BM_RQ%22%5D%7D",
LAST);
POST请求Json串发送
注意点:body中中文内容需转换成UTF8,且json串中的双引号前需加转义字符
示例:
lr_convert_string_encoding("管理员",LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"users");
lr_convert_string_encoding("古丽扎尔·库尔班",LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"xms");
lr_convert_string_encoding("性能测试",LR_ENC_SYSTEM_LOCALE,LR_ENC_UTF8,"resons");
lr_save_string(lr_eval_string("{xms}"),"xm");
lr_save_string(lr_eval_string("{users}"),"user");
lr_save_string(lr_eval_string("{resons}"),"reson");
web_custom_request("xxcx",
"URL=http://104.4.237.53:8888/pdn/service",
"Method=POST",
"TargetFrame=",
"Resource=0",
"RecContentType=application/json",//响应头的内容类型
"Referer=",
"Mode=HTTP",
"EncType=application/json;charset=UTF-8",//编码类型,“Content-Type”请求头的值
"Body={"SenderId":"C11-10000001","ServiceId":"S11-10000006","AuthorizeInfo":"B48A-1EEF-164C-B4CA","EndUser":{"UserCardId":"000000000000000","UserName":"{user}","UserDept":"010000000000","CallReason":"{reson}"},"Method":"PageQuery","Params":{"Condition":"SFZH = '653100197610030022' AND XM = '{xm}'","RequiredItems":"CSDGJ,SWYY,ZJXY,JSYXM,HYLBS,JGXZ,QLBZDZMS,BYZK,XQDM,SHGX1LXFS,SYBXH,CSSJ,CSZMBH,QTZZXZ,SHGXREGX,MZ,SHGXR2SFZH,DYSBH,SQJCWHDM,D1HZ,QWDZ,SHGXR2XM,JLXDM,SWZMBH,JHRYXM,HKXZ,MQXM,SHGX2LXFS,SSXQ,WHCD,SHGXR1XM,CSDXZ,BDSJ,D5HZ,YDDH,KGBS,SYQK,SWSJ,QCSJ,LXDH,SJDM,CSRQ,XM,XB,D1QZ,D3HZ,D2HZ,CZSJ,SJJZDXZ,JZYY,CSZMQFDW,FWCS,JSDW,SHGXR1SFZH,HYQLBZ,JHREJHGX,HYZK,FWCQRSFHM,BYJYCS,D3QZ,SHGXRYGX,YILBXH,HJDXZ,JHREGMSFHM,POXM,FJDM,HH,HSLBS,JHSY,JSZH,ZY,JGSSXQ,QTZJBH,YALBXH,XX,MQGMSFHM,PCSDM,HSQLBZ,ZZMM,CSZQFRQ,YHZGX,BDYY,YX,CZRXM,FWCQRXM,FQGMSFHM,SFHSBS,CZDWMC,QLBSDZMS,CZDWDM,QTZJMC,CSDSSXQ,BZ,DZBH,XZJDDM,FWXZ,SHGXREZZ,SFZH,POGMSFHM,GLZT,JHRYJHGX,HYZH,CYM,HKLB,FCZBH,SHGXRYZZ,SG,D5,BDFW,D4,JHRYGMSFHM,JGGJ,XMPY,QTZJLX,JHREXM,ZYLB,QCYY,D2,D3,D1,SWZMQFDW,FQXM","OrderItems":{"XM":"asc"},"RowsPerPage":10,"PageNum":1,"InfoCodeMode":"1"}}",
LAST);
List of Attributes支持的属性EncType
示例:
lr_save_string("53.1.49.62:8581","node_url");
lr_save_string("S90-34000035","vm_servce_id");
lr_save_string("C90-34000007","vm_sender_id");
//请求头内容
web_add_header("content-type","application/json;charset=UTF-8");
web_add_header("service_id","{vm_servce_id}");
web_add_header("sender_id","{vm_sender_id}");
web_add_header("fingerprint","{"endUser":"bukx,350825198101012620,0100,001"}");
web_add_header("task_period","60");
lr_start_transaction("rest-sawp");
web_reg_save_param("status",
"LB="status":"",
"RB="",
LAST);
web_custom_request("rest-sawp",
"URL=http://{node_url}/GatewayMsg/rest/invoke?opt=%7B%22condition%22:%22ajbh%20=%27A3401001052005040001%27%22,%22requiredItems%22:%5B%22ajbh%22,%22ajmc%22,%22asjbh%22,%22bb%22,%22bmbh%22,%22bmmc%22,%22clzt%22,%22djr%22,%22djrbh%22,%22djrq%22,%22dw%22,%22dwbh%22,%22dwd_zjid%22,%22dwmc%22,%22ms%22,%22ryid%22,%22sawp%22,%22sawpbm%22,%22sawplxdm%22,%22sawplxmc%22,%22sawplyxtsm%22,%22sawpwjbz%22,%22sawpwjid%22,%22sawpwjm%22,%22sawpztdm%22,%22sawpztmc%22,%22sjid%22,%22sl%22,%22zjz%22%5D,%22sortItems%22:%5B%22djrq%22%5D,%22pageNum%22:%221%22,%22pageSize%22:%2210%22,%22infoCodeMode%22:%220%22%7D",
"Method=GET",
"RecContentType=text/xml"
"EncType=",
LAST);
if(strcmp(lr_eval_string("{status}"),"000") == 0)
{
lr_end_transaction("rest-sawp", LR_PASS);
}
else
{
lr_error_message("返回报文结果有误,异常状态代码:%s",lr_eval_string("{status}"));
lr_end_transaction("rest-sawp", LR_FAIL);
}
Options方法,跨域请求的预检,需要向另外域名服务器发送OPTIONS请求,用以判断实际发送的请求是否安全,该部分内容可注释,通常出现这种情况时,某些请求的方式需要添加请求头
// web_custom_request("user",
// "URL=http://192.168.5.106:6020/api/qb-qtda-xm/user",
// "Method=OPTIONS",
// "TargetFrame=",
// "Resource=0",
// "Referer=http://192.168.5.147:8585/",
// "Mode=HTML",
// LAST);
4. 事务函数 lr_start_transaction, lr_end_transaction
事务是记录从客户端到服务器端,服务器端返回到客户端应答的时间,可以反映出一个操作所用的时间。
lr_start_transaction("事务名称"):事务开始
lr_end_transaction("事务名称","事务状态"):事务结束,事务状态LR_AUTO,LR_PASS,LR_FAIL,LR_STOP
5. 关联函数 web_reg_save_param
关联定义:在服务器所响应的内容中查找,得到相应的值,以变量的形式替换录制时的静态值,从而向服务器发出正确的请求,这种动态获得服务器响应内容的方法被称作关联。
关联核心原理:本质是:查找;从哪里查找:从响应中查找;如何查找:通过左右边界查找;
双引号需做转义。
参数与关联函数的区别:参数列表中的参数都是静态参数。关联函数保存的是动态参数。
web_reg开头的都是放置请求前,预处理函数。
例子(获取请求头内容)
web_reg_save_param("authorization",
"LB=authorization: ",
"RB=\r\n", //回车换行的标识
"Search=Headers",
LAST);
查找的响应内容如下:
例子(人员背审动态获取taskid):
web_reg_save_param("taskid",
"LB=data":"",
"RB=",",
“Search=Body”,
"ORD=ALL", //如果多个值ORD=1
LAST);
从下一个请求返回的内容中做关联。
注意:当要保存的内容长度超出256字节时,报错如下:
Error -26377: No match found for the requested parameter "userInfo". Check whether the requested boundaries exist in the response data. Also, if the data you want to save exceeds 256 bytes, use web_set_max_html_param_len to increase the parameter size
出现该报错信息时,需要在关联函数web_reg_save_param前面加入函数web_set_max_html_param_len设置参数字符串的最大长度
web_set_max_html_param_len
语法:
int web_set_max_html_param_len(const char * length);
说明:
设置可检索并保存为参数的任何HTML字符串的最大长度
例子:
web_set_max_html_param_len("1024")
6.web_reg_find
为了使测试结果有效,则需要在脚本中加入检查点。web_reg_find就是检查点常用函数。
例子(ZDR登录成功检查点):
web_reg_find("Fail=NotFound",
"Search=Body",
"SaveCount=loginst",
"Text=河南重点人员动态管控系统",
LAST);
参数解释: Search用来定义查找范围,SaveCount定义查找计数变量名称,该参数可以记录在缓存中查找内容出现的次数,可以使用该值,来判断要查找的内容是否被找到;
//判断是否找到
if (atoi(lr_eval_string("{loginst}")) > 0){
lr_end_transaction("登录", LR_PASS);}
else{
lr_end_transaction("登录", LR_FAIL);
}
7.atoi
函数说明:把字符串转换成整型数。
例子(将计数变量转成整型以便进行数值判断):
atoi(lr_eval_string("{loginst}")
8.lr_eval_string
函数说明:返回参数的值(从参数中取得对应的值,并且转换为一个字符串)。
例子(返回计数变量参数的值):
lr_eval_string("{loginst}")
9.lr_save_string
函数说明:将指定字符串保存至参数。
int lr_save_string( const char *param_value, const char *param_name);
例子({n}是一个随机的参数值,通过随机的参数值组合成uuid值,保存到参数uuid供使用):
lr_save_string(lr_eval_string("{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}"),"uuid");
10.lr_convert_string_encoding
函数说明:字符串编码转换。
lr_convert_string_encoding(const char *sourceString, const char *fromEncoding,const char *toEncoding, const char *paramName);
sourceString:被转换的源字符串。
fromEncoding:转换前的字符编码。
toEncoding:要转换成为的字符编码。
paramName:转换后的目标字符串。
例子(将从服务器返回的内容(例:单位名称)从编码UTF-8转成系统编码,以便进行识别查看):
lr_convert_string_encoding( lr_eval_string("{deptName}"),LR_ENC_UTF8,LR_ENC_SYSTEM_LOCALE,"dept" );
或
lr_convert_string_encoding(lr_eval_string("{deptName}"),"utf-8",NULL,"dept");
转码多出\x00(空格),通过 lr_save_string(lr_eval_string("{gkmjxmUtf}"),"gkmjxmUtf8"); 可去掉该多余内容
LR日志乱码转换:
lr_convert_string_encoding("绯荤粺寮傚父锛欳",LR_ENC_UTF8 ,LR_ENC_SYSTEM_LOCALE, "UnicodeString");
lr_error_message("123ErrMsg:%s",lr_eval_string("{UnicodeString}"));
11.字符串处理函数
【strcmp】
函数说明:比较字符串是否相等
int strcmp( const char *string1, const char *string2 );
示例1(中秋博饼检查点判断):
//比较输出字符串
int result;
result = strcmp(lr_eval_string("{status}"),"true");
//字符串相等则通过
if(result==0){
lr_output_message(lr_eval_string("{status}"));
lr_end_transaction("BoBing", LR_PASS);
}else{
lr_end_transaction("BoBing", LR_FAIL);
}
示例2(接口返回报文状态码校验)
if(strcmp(lr_eval_string("{code}"),"000") == 0)
{
lr_end_transaction("数据比对", LR_PASS);
}
else
{
lr_error_message("返回报文结果有误,异常状态代码:%s",lr_eval_string("{code}"));
lr_end_transaction("数据比对", LR_FAIL);
}
【strcat】
函数说明:连接2个字符串
char *strcat( char *to, const char *from );
例子:
char msgtest[1024]="导入名单共";
strcat(msgtest,“3人”);
最终效果:msgtest变量值=“导入名单共3人”
【strcpy】
将一个字符串复制到另一块空间地址中的函数。
char* strcpy(char* destination,const char* source);
示例:
char cUrl[100];
char *str="李";
strcpy(cUrl,urlEncDebug(str));
12.消息输出函数
【lr_message】
int lr_message (const char *format, exp1, exp2,...expn.);
中文解释:lr_message函数将信息发送到日志文件和输入窗口。在VuGen中运行时,输入文件为output.txt。
【lr_log_message】
int lr_log_message (const char *format, exp1, exp2,...expn.);
中文解释:lr_log_message函数将消息发送到Vuser或代理日志文件(取决于应用程序),而不是发送到输出窗口。通过向日志文件发送错误消息或其他信息性消息,可以将该函数用于调试。
【lr_error_message】
int lr_error_message (const char *format, exp1, exp2,...expn. );
中文解释:lr_error_message函数将错误消息发送到输出窗口和Vuser日志文件。要发送不是特定错误消息的特殊通知,请使用lr_output_message。
【lr_output_message】
int lr_output_message (const char *format, exp1, exp2,...expn.);
中文解释:lr_output_message函数将带有脚本部分的行号的消息发送到输出窗口和日志文件。
【lr_vuser_status_message】
int lr_vuser_status_message (const char *format);
中文解释:lr_vuser_status_message函数向控制器或优化模块控制台的vuser窗口的“状态”区域发送字符串。它还将该字符串发送到vuser日志。从VuGen运行时,消息被发送到output.txt。
lr_vuser_status_message("正在请求首页");
13.集合点函数
lr_rendezvous("rdz");//放在事务开始之前
14.web_concurrent_start、int web_concurrent_end
web_concurrent_start
语法:
int web_concurrent_start ( [char * ConcurrentGroupName,] NULL );
参数:
ConcurrentGroupName:可选的,并发组的标识符。
NULL:参数列表结束的标记符。
int web_concurrent_end
语法:
int web_concurrent_end ( reserved );
参数:
reserved:保留的供扩展的字段。
返回值
整型。返回LR_PASS (0)表示成功,返回LR_FAIL (1)表示失败。
说明
web_concurrent_start函数是并发组开始的标记。组中所有的函数是并发执行的。web_concurrent_end函数是并发组结束的标记。脚本执行时,碰到 web_concurrent_end函数时,开始并发执行所有记录的函数。
在并发组中,可以包含的函数有:web_url、web_submit_data、web_custom_request、web_create_html_param、web_create_html_param_ex、web_reg_save_param、web_add_header。
在并发组中的函数不是立即执行的。在并发组开始时,所有的函数首先被记录下来,当并发组结束时,所有的函数并发执行。
所有的Web 用户,HTTP模式下的WAP用户持本函数。运行在Wireless Session Protocol(WSP)回放模式下的WAP虚拟用户,不支持本函数。
int web_concurrent_end
语法:
int web_concurrent_end ( reserved );
参数:
reserved:保留的供扩展的字段。
返回值
整型。返回LR_PASS (0)表示成功,返回LR_FAIL (1)表示失败。
说明
web_concurrent_end,并发组结束的标记。脚本执行时,碰到 web_concurrent_end函数时,开始并发执行所有记录的函数。
在并发组中的函数不是立即执行的。在并发组开始时,所有的函数首先被记录下来,当并发组结束时,所有的函数并发执行。
15.URL编码函数 web_convert_param
语法:
int web_convert_param( const char *ParamName, [char *SourceString] char *SourceEncoding, char *TargetEncoding, LAST );
参数:
说明:
参数转码为url编码
例子(url地址编码,红色字体为url编码,假设要对url地址进行参数化,则参数化后需要进行url编码再发送):
http://192.168.7.121:9080/didsserver/login?service=http%3A%2F%2F192.168.160.7%3A1010%2Ftdas_xj%2Findex.html&appId=010000000000011&loginPage=dragonQQFW2LoginView_prm.jsp&forwardUrl=/tdas_xj/index.html&isReturn=true)
使用fiddler工具进行转码,操作如下:
脚本:
lr_save_string("http://192.168.160.7:1010/tdas_xj/","url");
lr_convert_string_encoding(lr_eval_string("{url}"),LR_ENC_SYSTEM_LOCALE, LR_ENC_UTF8 , "urlcode");
web_convert_param("urlcode", "SourceEncoding=PLAIN", "TargetEncoding=URL",LAST );
16.lr_save_var截取任意字符串长度
lr_save_var(token+272,36,0,"the_token");//截取token值,token的起始位置272,token值长度36
17.web_add_auto_header 自动在每个请求上添加请求头
web_add_auto_header("Authorization", "{authorization}");
web_add_auto_header("app_key", "appId");
异步请求头:
web_add_auto_header("x-requested-with","XMLHttpRequest");
18.web_add_header添加请求头
web_add_header("content-type","application/json;charset=UTF-8");
19.flex_amf_call flex协议请求函数
flex_amf_call("AMF3_call_5",
"Gateway=http://192.168.23.230:9080/dids/messagebroker/amf",
"Snapshot=t52.inf",
"ResponseParameter=resultXml",
MESSAGE,
"Method=null",
"TargetObjectId=/7",
BEGIN_ARGUMENTS,
"
"<flex.messaging.messages.RemotingMessage>\n
"/destination>\n
"messageId>\n
"
"
"
">\n
"
"custom">\n
"
"
" </flex.messaging.io.amf.ASObject>\n </"
"flex.messaging.io.amf.ASObject>\n
"
"
"
"<flex.messaging.io.amf.ASObject>\n
"
"inToString>\n
"flex.messaging.io.amf.ASObject>\n </flex.messaging.io.amf.ASObject"
">\n
"object-externalizable-custom>
END_ARGUMENTS,
LAST);
//获取总条数
lr_xml_get_values("XML={resultXml}",
"FastQuery=/AMFPacket/Messages/Message/AMF3/object-externalizable-custom/flex.messaging.messages.AcknowledgeMessageExt/flex.messaging.io.amf.ASObject/map/com.dragonsoft.commons.dao.ResultSet/total",
"ValueParam=total",
LAST);
20. lr_xml_get_values xml格式数据获取
int NumOfValues;
int i;
char buf[1000];
NumOfValues=lr_xml_get_values("XML={SEARCHresult}",
"Query=/AMFPacket/Messages/Message/AMF3/object-externalizable-custom/flex.messaging.messages.AcknowledgeMessageExt/flex.messaging.io.amf.ASObject/map/com.dragonsoft.commons.dao.ResultSet/rs/object-array/com.dragonsoft.dids.manager.flexservice.action.org.ManVo/idcard",
"ValueParam=ParamValueidcard",
"SelectAll=yes", //返回多个值时使用,默认是no,返回第一个值
LAST);
//从所有值里面随机取一个值
i=rand()%NumOfValues;
sprintf (buf, "{ParamValueidcard_%d}", i);
lr_output_message(lr_eval_string(buf));
21.web_service_call webservice协议请求函数
web_service_call( "StepName=query_103",
"SOAPMethod=CommonCallServiceImplService|commonCall|query",
"ResponseParam=response",
"Service=CommonCallServiceImplService",
"URL=http://192.168.23.203:8080/service/services/commonCall",
"ExpectedResponse=SoapResult",
"Snapshot=t1572403092.inf",
BEGIN_ARGUMENTS,
"opt={"ServiceID":"model","first":"{sheng}","second":"大庆市"}",
END_ARGUMENTS,
BEGIN_RESULT,
END_RESULT,
LAST);
请求服务
web_service_call( "StepName=PageQuery_102",
"SOAPMethod=SjcxWebServiceService|RequestService|PageQuery",
"ResponseParam=response",
"Service=SjcxWebServiceService",
"ExpectedResponse=SoapResult",
"Snapshot=t1543314317.inf",
BEGIN_ARGUMENTS,
"SenderID=C00-10002281",
// "SenderID=C00-10000241",
"ServiceID=S10-10006150",
"xml:EndUser="
"
"
"
"DataObjectCode=C001",
"Condition=HPHM = '川S87177'",
"xml:RequiredItems="
"
"
"InfoCodeMode=",
"RowsPerPage=50",
"PageNum=1",
END_ARGUMENTS,
BEGIN_RESULT,
END_RESULT,
LAST);
22.lr_paramarr_random 从关联参数中随机取值
//link为返回的所有参数值,通过关联获取
lr_paramarr_random(link)
23.web_set_max_html_param_len("1024");
24.lr_save_datetime("%Y%m%d%H%M%S",DATE_NOW,"timenow");
uuid设置A-Z 0-9拼装
lr_save_string(lr_eval_string("{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}{n}"),"uuid");
25、web_get_int_property获取返回数据大小
使用函数web_get_int_property,判断图片大小,图片大小是body+header 判断大于800bytes即可
i = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);
lr_output_message("The download size of the URL was: %d",i);
if(i > 10000)
{ lr_end_transaction("DownloadUrL", LR_PASS); }
else { lr_end_transaction("DownloadUrL", LR_FAIL); }
脚本编写注意点
1.变量放置位置需要放置在最前面,否则会报错
如下图所示:
2.有些场景请求虽然已发送完成,但实际上后台任务并未完成,这时需要自己手动加入一些判断条件
例子:
上传采集,请求已完成,但是后台的入库并未完全完成,需要增加判断条件
如下图所示(加入do while判断):