- 浏览: 34313 次
- 性别:
- 来自: 上海
最新评论
应用范围在使用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 scrīpt
将返回的数据记录到日志
直接手工访问页面,检查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)如果脚本中中文为乱码,可能是因为源文件的字符集和操作系统字符集不匹配。
补充:
众所周知,在LoadRunner中,关联是一个很重要的动作,大多数的脚本在录制完成后并不能直接回放,需要通过一定的关联才能成功回放。关联的技巧有很多,这里介绍的就是其中之一,以下用一个实际的例子来说明。
脚本的背景如下:
web_submit_data("classiLoanMaterial.jsf_2")(web_submit_data函数的其它部分省略,下同。)返回的页面上可能存在多条记录,可能一条,可能两条,也可能三条,等等。我们需要将这些记录逐个选中进行操作。注意:不是全部选中,而是要逐条记录进行操作。同时,每一条记录各有一个编号,这是需要进行关联的值。在下面的操作中web_url("directAdjust.jsf",
"URL=http://128.64.96.105:1158/clpmapp/bizprocess/loanservice/creditassetsriskclassi/
classiadjuststepbystep/directAdjust.jsf?approveFormNum=123456")需要使用到该编号,即黑体字部分的值。面对这样的目的,很自然地,我们会想到用一个循环语句来实现。首先,在classiLoanMaterial.jsf页面之前加一个关联如下:
web_reg_save_param("sor","LB=sor\" value=\"","RB=\"","Ord=ALL",LAST);将Ord参数值设定为ALL,则关联函数将自动把符合条件的关联值保存到参数数组里。在本例中,假设关联值返回三条记录,则LR分别将值保存到sor_1,sor_2,sor_3中,同时,LR还将自动创建一个sor_count变量来保存总的记录数,在这里sor_count值等于3。利用这些信息,我们就可以很方便地在循环语句中实现我们的目的了。步骤如下:
1、声明各变量:
int count;
int i;
char sor[50];
char sorvalue[50];
2、将返回的记录数保存到count变量里:
count=atoi(lr_eval_string("{sor_count}"));
3、使用for循环:
for(i=1;i<=count;i++)
{
sprintf(sor,"{sor_%d}",i); //分别将各个sor值保存到sor字符串中
sprintf(sorvalue,"%s",lr_eval_string(sor));//通过lr_eval_string函数将字符串赋给sorvalue变量
}
4、在循环体中使用关联值替换相关值:
web_url("directAdjust.jsf",
"URL=http://128.64.96.105:1158/clpmapp/bizprocess/loanservice/creditassetsriskclassi/
classiadjuststepbystep/directAdjust.jsf?approveFormNum={sorvalue}")
一切看起来似乎顺理成章,然而如果按照以上的步骤做下来,将会很遗憾地发现:我们定义的{sorvalue}值根本就不被LR认可并接受,于是它将无情地给我们抛出一个错误,说该值是非法的。怎么办?难道我们前面做的一切都白费了吗?
有句老话说得好:天无绝人之路。聪明而又善良的LR开发团队已经为我们考虑到了这个问题,给我们预备了一个很有用的函数:lr_save_string,它可以帮助我们解决这个问题。于是我们祭出lr_save_string这道最后的杀手锏:
5、在使用关联值之前进行字符串格式转换:
lr_save_string(sorvalue,"sorvalue1");
web_url("directAdjust.jsf",
"URL=http://128.64.96.105:1158/clpmapp/bizprocess/loanservice/creditassetsriskclassi/
classiadjuststepbystep/directAdjust.jsf?approveFormNum={sorvalue1}")
需要特别注意lr_save_string的用法,它是参数值在前(sorvalue),参数名在后("sorvalue1"),这和一般的习惯用法正好反过来(真是好奇怪!)。而且"sorvalue1"这个参数名称不需要事先声明,它只是一个字符串而已(这也比较奇怪! )。
(转载)
简要说明语法:
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 scrīpt
将返回的数据记录到日志
直接手工访问页面,检查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)如果脚本中中文为乱码,可能是因为源文件的字符集和操作系统字符集不匹配。
补充:
众所周知,在LoadRunner中,关联是一个很重要的动作,大多数的脚本在录制完成后并不能直接回放,需要通过一定的关联才能成功回放。关联的技巧有很多,这里介绍的就是其中之一,以下用一个实际的例子来说明。
脚本的背景如下:
web_submit_data("classiLoanMaterial.jsf_2")(web_submit_data函数的其它部分省略,下同。)返回的页面上可能存在多条记录,可能一条,可能两条,也可能三条,等等。我们需要将这些记录逐个选中进行操作。注意:不是全部选中,而是要逐条记录进行操作。同时,每一条记录各有一个编号,这是需要进行关联的值。在下面的操作中web_url("directAdjust.jsf",
"URL=http://128.64.96.105:1158/clpmapp/bizprocess/loanservice/creditassetsriskclassi/
classiadjuststepbystep/directAdjust.jsf?approveFormNum=123456")需要使用到该编号,即黑体字部分的值。面对这样的目的,很自然地,我们会想到用一个循环语句来实现。首先,在classiLoanMaterial.jsf页面之前加一个关联如下:
web_reg_save_param("sor","LB=sor\" value=\"","RB=\"","Ord=ALL",LAST);将Ord参数值设定为ALL,则关联函数将自动把符合条件的关联值保存到参数数组里。在本例中,假设关联值返回三条记录,则LR分别将值保存到sor_1,sor_2,sor_3中,同时,LR还将自动创建一个sor_count变量来保存总的记录数,在这里sor_count值等于3。利用这些信息,我们就可以很方便地在循环语句中实现我们的目的了。步骤如下:
1、声明各变量:
int count;
int i;
char sor[50];
char sorvalue[50];
2、将返回的记录数保存到count变量里:
count=atoi(lr_eval_string("{sor_count}"));
3、使用for循环:
for(i=1;i<=count;i++)
{
sprintf(sor,"{sor_%d}",i); //分别将各个sor值保存到sor字符串中
sprintf(sorvalue,"%s",lr_eval_string(sor));//通过lr_eval_string函数将字符串赋给sorvalue变量
}
4、在循环体中使用关联值替换相关值:
web_url("directAdjust.jsf",
"URL=http://128.64.96.105:1158/clpmapp/bizprocess/loanservice/creditassetsriskclassi/
classiadjuststepbystep/directAdjust.jsf?approveFormNum={sorvalue}")
一切看起来似乎顺理成章,然而如果按照以上的步骤做下来,将会很遗憾地发现:我们定义的{sorvalue}值根本就不被LR认可并接受,于是它将无情地给我们抛出一个错误,说该值是非法的。怎么办?难道我们前面做的一切都白费了吗?
有句老话说得好:天无绝人之路。聪明而又善良的LR开发团队已经为我们考虑到了这个问题,给我们预备了一个很有用的函数:lr_save_string,它可以帮助我们解决这个问题。于是我们祭出lr_save_string这道最后的杀手锏:
5、在使用关联值之前进行字符串格式转换:
lr_save_string(sorvalue,"sorvalue1");
web_url("directAdjust.jsf",
"URL=http://128.64.96.105:1158/clpmapp/bizprocess/loanservice/creditassetsriskclassi/
classiadjuststepbystep/directAdjust.jsf?approveFormNum={sorvalue1}")
需要特别注意lr_save_string的用法,它是参数值在前(sorvalue),参数名在后("sorvalue1"),这和一般的习惯用法正好反过来(真是好奇怪!)。而且"sorvalue1"这个参数名称不需要事先声明,它只是一个字符串而已(这也比较奇怪! )。
(转载)
发表评论
-
列表判定状态值 关联
2012-08-31 12:12 931归总一下,处理列表关联后针对部分特定内容判定方法: 1、对两个 ... -
关联数组(转载)
2012-08-29 00:01 1103http://www.blogjava.net/xingcyx ... -
LoadRunner参数化详解 (转载)
2012-07-20 00:02 1087参数化的方法 ... -
LR 关联高级篇
2012-07-13 14:26 11553.7.6 关联函数的高级使用 上面详细介绍了关联的作用和关 ... -
随机数
2010-03-17 22:10 1410vuser_init() { int id; char *vu ... -
关于怎么在LR中模拟下载的动作(转)
2010-01-15 16:31 1330#include "as_web.h" ... -
loadrunner的atof函数有问题(转)
2010-01-15 16:28 1112float x; char *s = &quo ... -
界面设计与测试规则
2010-01-15 16:28 795界面是软件与用户交互 ... -
LoadRunner本机录制http协议程序遇到的问题以及解决方法
2010-01-15 16:26 1049在本机录制asp.net程序petshop的时候刚开始使用了传 ... -
C语言应用于LR中-如何得到数组长度(转)
2010-01-15 16:24 1511C语言没有提供获取数组长度的函数,最起码我不知道,所以编写了一 ... -
Return的返回值
2010-01-15 16:23 789问题: 在创建和 ... -
LR script
2010-01-15 16:21 816#include "web_api.h" ... -
脚本学习笔记
2010-01-15 09:53 13661、写入数据到文件:(实际应用中可以将关联得到的参数写入文件) ... -
LR 脚本 循环读取并显示该文件中的每行数据
2010-01-15 09:49 18491、循环读取并显示该文件中的每行数据:(只能读数字内容) Ac ... -
SQL
2009-03-29 21:47 708http://bbs.51testing.com/thread ... -
软件测试工程师面试英语
2009-03-29 21:38 10751. What types of docume ...
相关推荐
于是需要首先读出当前的事务的状态,再进行修改,此时便可以使用到web_reg_save_param了。可以通过它先将事务的状态读出写入一个自定义的变量中,根据变量的值来决定下一步的动作。 简要说明 语法:intweb_reg_...
### 在LoadRunner中使用`web_reg_save_param()`进行关联 #### 一、LoadRunner关联概述 在LoadRunner中,关联是一种重要的技术手段,用于解决在录制脚本时遇到的动态数据问题。通常有两种关联方式:手动关联和自动...
2. **使用关联函数**: LoadRunner提供了多个函数来帮助实现关联,其中最常用的是`web_reg_save_param`。 ```c web_reg_save_param( const char *ParamName, /* 参数名 */ ListofAttributes, /* 属性列表 */ ...
**關聯操作**:使用`web_reg_save_param`函數來提取`userSession`的值,並將其存儲為一個參數。 ```vb web_reg_save_param("usersession", "LB=name=userSessionvalue=", "RB=>", "ORD=1", LAST); ``` 這裡,“LB...
3.7.6 关联函数web_reg_save_param_regexp详解 3.7.7 关联函数web_reg_save_param_xpath详解 3.7.8 关联函数的高级使用 3.8 检查点 3.8.1 文本检查点 3.8.2 自动检查点 3.8.3 图片检查点 3.9 事务 3.9.1 ...
3.7.6 关联函数web_reg_save_param_regexp详解 3.7.7 关联函数web_reg_save_param_xpath详解 3.7.8 关联函数的高级使用 3.8 检查点 3.8.1 文本检查点 3.8.2 自动检查点 3.8.3 图片检查点 3.9 事务 3.9.1 ...
3.7.6 关联函数web_reg_save_param_regexp详解 3.7.7 关联函数web_reg_save_param_xpath详解 3.7.8 关联函数的高级使用 3.8 检查点 3.8.1 文本检查点 3.8.2 自动检查点 3.8.3 图片检查点 3.9 事务 3.9.1 ...
3.7.6 关联函数web_reg_save_param_regexp详解 3.7.7 关联函数web_reg_save_param_xpath详解 3.7.8 关联函数的高级使用 3.8 检查点 3.8.1 文本检查点 3.8.2 自动检查点 3.8.3 图片检查点 3.9 事务 3.9.1 ...
3.7.6 关联函数web_reg_save_param_regexp详解 3.7.7 关联函数web_reg_save_param_xpath详解 3.7.8 关联函数的高级使用 3.8 检查点 3.8.1 文本检查点 3.8.2 自动检查点 3.8.3 图片检查点 3.9 事务 3.9.1 ...
3.7.6 关联函数web_reg_save_param_regexp详解 3.7.7 关联函数web_reg_save_param_xpath详解 3.7.8 关联函数的高级使用 3.8 检查点 3.8.1 文本检查点 3.8.2 自动检查点 3.8.3 图片检查点 3.9 事务 3.9.1 ...
如果参数有多个值,可以使用 web_reg_save_param 函数带有 "Ord=All" 参数来获取所有的数值。例如: web_reg_save_param("参数名","LB=左边界","RB=右边界","Ord=All",LAST); 注册成功后,{参数名_count} 表示取得...
LoadRunner 中有多种方式来实现关联(Correlation),例如使用 web_reg_save_param 函数来保存参数,使用 web_create_html_param 和 web_create_html_param_ex 函数来创建 HTML 参数。这些函数可以帮助我们从服务器...
12. **web_reg_find** 和 **web_reg_save_param**:这两个函数用于注册和提取动态HTML页面中的信息,以便在后续请求中使用。 13. **web_disable_keep_alive** 和 **web_enable_keep_alive**:控制HTTP连接的Keep-...
例如,在上面的例子中,我们使用 web_reg_save_param() 函数来提取百度首页中的“新闻”关键词。 web_reg_save_param("keyword", "LB=href=http://news.baidu.com>", "RB=</a>", LAST); 这个函数将会在百度...
web_reg_save_param 此函数用于保存通过正则表达式匹配得到的值作为参数。 #### 21. web_set_max_html_param_len 这个函数用于设置最大HTML参数长度。 #### 22. web_add_filter 和 web_add_auto_filter 这些函数...
`web_reg_save_param()`函数是LoadRunner中最常用的关联函数之一,它用于捕获HTTP响应中动态变化的数据,并将其保存为参数供后续请求使用。 - **Parameter Name**: 参数名称,用于指定保存关联结果的参数名。 - ...
一、关联原理 二、自动关联 三、手动关联 四、一边录制一边关联 五、关联函数Web_reg_save_param详解
2. **JavaScript交互**:通过web_reg_find()和web_reg_save_param()注册和捕获页面上的JavaScript变量,模拟JavaScript交互。 3. **AJAX处理**:由于AJAX异步请求,LoadRunner提供了web_custom_request()和web_url_...
4. **插入`web_reg_save_param()`**:在Action.c脚本中找到对应的方法(如`web_submit_data()`),在其前面添加`web_reg_save_param()`,指定LB(左边界)和RB(右边界),以及保存动态数据的变量名。 5. **验证...
- **优化脚本:** 对于已筛选出的验证码session,建议调整`web_reg_save_param`的边界值,使其更精确地指向验证码,减少不必要的循环操作,提高脚本执行效率。 **2.4 参数化处理** - **参数化验证码:** 将捕获到...