loadrunner web_reg_save_param 注册函数解析

 

纯属转帖~~·

RelFrameID:(个人理解)在使用关联函数时,通过此参数确认使用哪个页面的数据作关联。

      原因和web_reg_save_param工作原理有关,函数中有reg 说明它是个注册函数,注册函数工作原理与普通函数不同,它注册并提供的一项服务,每当有网页下载完成,那么只要你在脚本中注册了 web_reg_save_param,那么它就会触发它的参数关联验证功能,会去查找数据 。

     举一个具体的例子:我们使用web_url("www.xxx.com",LAST)去访问获得网站的资源,在实际下载时,下载的可能不只一个页面,有时候可能会下载一个或者多个iframe,或者有验证码的页面被调用等等。这时候下载的页面就不止一个了。那么web_reg_save_param如何去识别使用哪个页面呢,靠的就是这个参数。

    web_reg_save_param的工作原理是每当有一个页面被完成加载,那么它就会执行数据查找更新。像上述情况,如果不指定页面的话,web_reg_save_param的值始终会是最后被下载完成的页面。

     今天碰到实际的问题就是:有多个页面被下载,web_reg_save_param被多次调用。关联值不正确。

     解决方法;

     在web_reg_save_param函数中,添加:RelFrameID属性,并且将值 =1. 这样指定第一个页面的数据将被查找使用。后面页面下载完成不操作,不改变关联值。 具体其它的值,我测试了, 1.1 1.2 2.1等都没有实现具体的效果(我访问的页面是 一个login.aspx。在login.aspx中 有个img 元素调用了ACT.aspx验证码页面。)。 如果大家也有碰到同样的问题,也来交流吧。

 

在使用Loadrunner进行性能测试时,经常遇到一种情况,需要通过web页面修改某事务的状态。于是需要首先读出当前的事务的状态,再进行修改,此时便可以使用到web_reg_save_param了。可以通过它先将事务的状态读出写入一个自定义的变量中,根据变量的值来决定下一步的动作。

  • 简要说明

语法:

int web_reg_save_param(const char *ParamName, <list of Attributes>, LAST);

参数说明:

  • ParamName: 存放得到的动态内容的参数名称
  • list of Attributes: 其它属性,包括:Notfound, LB, RB, RelFrameID, Search, ORD, SaveOffset, Convert, SaveLen。属性值不分大小写
    • Notfound: 当在返回信息中找不到要找的内容时应该怎么处理
    • Notfound=error: 当在返回信息中找不到要找的内容时,发出一个错误讯息。这是缺省值。
    • Notfound=warning: 当在返回信息中找不到要找的内容时,只发出警告,脚本也会继续执行下去不会中断。
    • LB( Left Boundary ) : 返回信息的左边界字串。该属性必须有,并且区分大小写。
    • RB( Right Boundary ): 返回信息的右边界字串。该属性必须有,并且区分大小写。
    • RelFrameID: 相对于URL而言,欲查找的网页的Frame。此属性质可以是All或是数字,该属性可有可无。
    • Search : 返回信息的查找范围。可以是Headers,Body,Noresource,All(缺省)。该属性质可有可无。
    • ORD : 说明第几次出现的左边界子串的匹配项才是需要的内容。该属性可有可无,缺省值是1。如为All,则将所有找到的内容储存起来。
    • SaveOffset : 当找到匹配项后,从第几个字元开始存储到参数中。该属性不能为负数,缺省值为0。
    • SaveLen :当找到匹配项后,偏移量之后的几个字元存储到参数中。缺省值是-1,表示一直到结尾的整个字串都存入参数。
    • Convert : 可取的值有以下两种:

HTML_TO_URL : 将 HTML-encoded 资料转成 URL-encoded 资料格式

HTML_TO_TEXT : 将 HTML-encoded 资料转成纯文字资料格式

  • 实例讲解

目的:取得页面中的商品状态,如果状态是正常态就改为注销态,否则改为正常态。

录制脚本使用的是URL based script

将返回的数据记录到日志

  • 直接手工访问页面,检查URL

该页面上点击右键,选择属性

看到URL,对照录制下的脚本中有:
web_url("modifyOfferingStatePage.do",
"URL={url}/web/businessAccept/order/modifyOfferingStatePage.do?offeringId=
282172&offeringSpecId=1&offeringSpecName=普通宽带(ADSL/LAN)&customerName=
{clientname}&nodeId=260000&pos1=定购管理&pos2=修改商品状态",

"Resource=0",
"RecContentType=text/html",
"Referer={url}/web/businessAccept/order/orderMenu.do",
"Snapshot=t23.inf",
"Mode=HTTP",
LAST);
于是在这段代码前添加注册函数:
web_reg_save_param("oldstate",
"LB/IC=原有商品状态:</td>",
"RB/IC=</td>",
"Search=body",
"Ord=1",
"RelFrameId=1",
"SaveOffset=57",
"SaveLen=4",
LAST);
web_url("modifyOfferingStatePage.do",
"URL={url}/web/businessAccept/order/modifyOfferingStatePage.do?offeringId=
282172&offeringSpecId=1&offeringSpecName=
普通宽带(ADSL/LAN)&customerName={clientname}&nodeId=
260000&pos1=定购管理&pos2=修改商品状态",

"Resource=0",
"RecContentType=text/html",
"Referer={url}/web/businessAccept/order/orderMenu.do",
"Snapshot=t23.inf",
"Mode=HTTP",
LAST);
...............
//将得到的内容存入日志用于检查
lr_log_message("getvalue : %s",lr_eval_string ("{oldstate}"));

if ( lr_eval_string ("{oldstate}") == "正常"){
web_submit_data("modifyOfferingState.do",
"Action={url}/web/businessAccept/order/modifyOfferingState.do",
"Method=POST",
"RecContentType=text/html",
"Referer={url}/web/businessAccept/order/modifyOfferingStatePage.do?offeringId=
282172&offeringSpecId=1&offeringSpecName=普通宽带(ADSL/LAN)&customerName=
{clientname}&nodeId=260000&pos1=定购管理&pos2=修改商品状态",

"Snapshot=t24.inf",
"Mode=HTTP",
ITEMDATA,
"Name=offering.state", "Value=1", ENDITEM,
"Name=offering.recentModifyReason", "Value=修改原因", ENDITEM,
"Name=offering.customerId", "Value=281218", ENDITEM,
"Name=offering.offeringId", "Value=282172", ENDITEM,
"Name=offering.offeringSpecId", "Value=1", ENDITEM,
"Name=offering.recentMender", "Value=root", ENDITEM,
"Name=offering.recentModifyDatetime", "Value=2005-01-16", ENDITEM,
"Name=nodeId", "Value=260000", ENDITEM,
"Name=customerName", "Value={clientname}", ENDITEM,
"Name=offeringSpecName", "Value=普通宽带(ADSL/LAN)", ENDITEM,
"Name=submit.x", "Value=33", ENDITEM,
"Name=submit.y", "Value=13", ENDITEM,
LAST);
}
Else
{
web_submit_data("modifyOfferingState.do",
"Action={url}/web/businessAccept/order/modifyOfferingState.do",
"Method=POST",
"RecContentType=text/html",
"Referer={url}/web/businessAccept/order/modifyOfferingStatePage.do?offeringId=
282172&offeringSpecId=1&offeringSpecName=普通宽带(ADSL/LAN)&customerName=
{clientname}&nodeId=260000&pos1=定购管理&pos2=修改商品状态",

"Snapshot=t24.inf",
"Mode=HTTP",
ITEMDATA,
"Name=offering.state", "Value=0", ENDITEM,
"Name=offering.recentModifyReason", "Value=修改原因", ENDITEM,
"Name=offering.customerId", "Value=281218", ENDITEM,
"Name=offering.offeringId", "Value=282172", ENDITEM,
"Name=offering.offeringSpecId", "Value=1", ENDITEM,
"Name=offering.recentMender", "Value=root", ENDITEM,
"Name=offering.recentModifyDatetime", "Value=2005-01-16", ENDITEM,
"Name=nodeId", "Value=260000", ENDITEM,
"Name=customerName", "Value={clientname}", ENDITEM,
"Name=offeringSpecName", "Value=普通宽带(ADSL/LAN)", ENDITEM,
"Name=submit.x", "Value=33", ENDITEM,
"Name=submit.y", "Value=13", ENDITEM,
LAST);
}
从日志中截取的真实的返回内容为:
vuser_init.c(689): <tr bgcolor="#F6F6F6">/r/n
vuser_init.c(689): <td width="30%" height="23" align="right">/r/n
vuser_init.c(689): 原有商品状态:</td>/r/n
vuser_init.c(689): <td width="70%" height="23"> 正常 </td>/r/n
vuser_init.c(689): </tr>/r/n
vuser_init.c(689): <tr bgcolor="#F4FBFE">/r/n
vuser_init.c(689): <td width="30%" height="23" align="right">/r/n
vuser_init.c(689): 修改后的状态:</td>/r/n
vuser_init.c(689): <td width="70%" height="23">/r/n
vuser_init.c(689): /r/n
vuser_init.c(689): /r/n
vuser_init.c(689): /r/n
vuser_init.c(689): <input type="radio" name='offering.state' value='4' checked>
可以看到左边界是:原有商品状态:</td>,
右边界是:</td>,偏移量为:57(包括了空格),
长度为:4(因为一个汉字长度为2),最后存入变量的值是:正常

4.经验总结
1)为了便于脚本的调试,将返回的数据都写入日志是个好办法;
2)为了验证取得的数据是否是自己期望的,可以将取得的数据写入日志中进行验证,
例:lr_log_message("getvalue : %s",lr_eval_string ("{oldstate}"));
3)因为它是一个注册函数,必须在返回信息前使用,所以注册的位置必须正确,否则很可能得到类似如下错误:
4)vuser_init.c(734): Error -27190: No match found for the requested parameter "oldstate".
Check whether the requested boundaries exist in the response data. Also,
if the data you want to save exceeds 1024 bytes,
use web_set_max_html_param_len to increase the parameter size [MsgId: MERR-27190]
5)vuser_init.c(734): Error -27187: The above "not found"
error(s) may be explained by header and body byte counts being 0 and 0,
respectively. [MsgId: MERR-27187]
6)vuser_init.c(734):
web_concurrent_end highest severity level was "ERROR" [MsgId: MMSG-27181]
7)所以使用手工方法,右键页面确定在代码中哪个位置之前注册函数至关重要
8)如果脚本中中文为乱码,可能是因为源文件的字符集和操作系统字符集不匹配。试试:

祝各位好运。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值