• LoadRunner常用函数


    前言

     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人”

    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 flexService<"
    "/destination>\n A03DDE4F-ECAE-FEBB-4FEF-70B51DFF1166</"
    "messageId>\n 0\n 0\n"
    " \n \n DSEndpoint\n "
    "my-amf\n
    \n \n DSId"
    "
    \n BF27F9CF-5F1C-ED7E-0405-6B21C35B5E42</string"
    ">\n
    \n
    \n run\n "
    "\n <flex.messaging.io.amf.ASObject serialization=""
    "custom">\n \n \n "
    "\n 0.75\n "
    "12\n
    \n 16\n"
    " 8\n USER_PWD\n <null"
    "/>\n orgId\n <string"
    ">00000000000000000000000000000001\n Method</"
    "string>\n findManAll\n <string"
    ">pageStart
    \n 1\n manArgs</"
    "string>\n <flex.messaging.io.amf.ASObject serialization=""
    "custom">\n \n \n "
    " \n 0.75\n "
    " 12\n
    \n "
    "16\n 3\n findType<"
    "/string>\n 1\n ManVo</"
    "string>\n <flex.messaging.io.amf.ASObject serialization=""
    "custom">\n \n <map"
    ">\n \n 0.75</"
    "loadFactor>\n 12\n "
    "
    \n 16\n 3<"
    "/int>\n policeNo\n "
    "\n idcard\n "
    " \n name\n "
    " {name}\n
    \n "
    " <flex.messaging.io.amf.ASObject>\n \n "
    " false\n "
    "false\n
    \n "
    " </flex.messaging.io.amf.ASObject>\n </"
    "flex.messaging.io.amf.ASObject>\n rightScope</"
    "string>\n 00000000000000000000000000000001</string"
    ">\n
    \n <flex.messaging.io.amf.ASObject>\n "
    " \n false\n "
    " false\n
    \n "
    " </flex.messaging.io.amf.ASObject>\n </"
    "flex.messaging.io.amf.ASObject>\n beanId\n "
    " manAction\n USER_NO\n "
    " admin\n rightCode\n "
    " \n \n "
    "<flex.messaging.io.amf.ASObject>\n \n "
    "false\n false</"
    "inToString>\n
    \n </"
    "flex.messaging.io.amf.ASObject>\n </flex.messaging.io.amf.ASObject"
    ">\n
    \n</flex.messaging.messages.RemotingMessage></"
    "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="
    ""
    "ptjian12345670100000000007654321"
    "
    ",
    "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判断):

  • 相关阅读:
    区域赛系列一多边形划分(卡特兰数)
    Going Home(最大匹配km算法)
    奔小康赚大钱(km)
    Air Raid(最小路径覆盖)
    Save Princess(丑数)
    Asteroids(最小点覆盖)
    Windows命令行命令总结
    SPI协议详解
    Python实现串口通信(pyserial)
    python中进制转换
  • 原文地址:https://www.cnblogs.com/seamy/p/15650754.html
Copyright © 2020-2023  润新知