LR手动关联参数化问题总结
所谓的关联就是把脚本中某些写死的代码(hard-coded)数据,转变成截取自服务器所送的、动态的、每次都不一样的数据。
一般情况下,比较聪明的服务器在每个浏览器第一次跟它要数据时,都会在数据中夹带一个唯一的辨识码,接下来就会利用这个辨识码来辨识跟它要数据的是不是同一个浏览器,一般称这个辨识码为SessionID。对于每个新的请求,服务器都会产生新的SessionID给浏览器。这也就是执行脚本会失败的原因,因为VuGen还是用旧的Session ID向服务器要数据,服务器发现这个Session ID是失效的或者它根本不认识这个Session ID,当然就不会传送正确的网页数据给VuGen了。
要对付这种服务器,必须想办法找出这个Session ID到底是什么、位于何处,然后把它撷取下来,放到某个参数中,并且取代脚本中有用到Session ID的部分,这样就可以成功骗过服务器,正确地完成整个交易了。
一、什么地方需要关联
凡是脚本每次执行时都必须获得唯一标识的地方都需要关联。假如脚本需要关联,如果不做关联是不会执行通过的,也就是说会有错误消息发生。不过很遗憾,并没有任何特定的错误消息是和关联有关系的。会出现什么错误消息,与系统实际的错误处理机制有关。错误消息有可能会提醒用户要重新登录,但是也有可能直接就显示HTTP 404的错误消息。
二、如何做关联
关联会用到下列的函数:
1、web_reg_save_param;
2、web_create_html_param;
3、web_create_html_param_ex;
其中,web_reg_save_param的语法为:
web_reg_save_param ( "Parameter Name" , < list of Attributes >, LAST );
web_create_html_param和web_create_html_param_ex这两个函数主要是保留以兼容以前旧版本。建议使用web_reg_save_param函数。
那么,如何找出要关联数据呢?简单地说,每一次执行时都会变动的值,就有可能需要做关联。VuGen提供两种方式帮助用户找出需要做关联的值:自动关联和手动关联。
自动关联一般情况下比较简单,在此就不进行说明了,下面主要是总结手动关联时的一些方法以及出现的一些问题的解决方式。
三、手动关联总结
1、正常情况下的手动关联:web_reg_save_param("SessionId","LB=value=\"","RB=\">",LAST);
LR:所需截取字符串的左边界
RB:所需截取字符串的右边界
如果左右边界中存在各种特殊字符,如双引号等,则需先用\进行转义
一般情况下,如果所截字符串的左右边界比较唯一的话,可以直接用上面的方式进行获取,无需设置别的属性了。
(“LAST”是固定的。。。)
2、如果进行关联后,有报错信息,提示参数化未成功,有可能是以下几方面的原因:
1)左右边界取值不正确,可以进入Generation log中,查看在关联的参数左右边界是否正确
2)关联函数的位置放置错误
可以将log设置成输出Extended log。
设置方法为:Vuser->Run-time Settings->Log属性中,选中Extended log 并选中下面三个日志。
在输出的日志中找到所要关联化的参数第一次的输出位置(注意是response返回的值,不是request中的),对照左侧的脚本行数,将关联函数放在此行数之前,即可。
3、关联没问题,运行时无报错,可就是得不到参数的值,可以从Extended log中找到原因。
将Replay Log中的日志改为输出Extended log->Parameter substitution日志,再重新运行一次,便可看到所关联参数的变化情况。
有一次我在录制了Flex协议的脚本后,将JSessionId做好手动关联,运行无任何错误,可是将JSessionId打印时却得不到任何值,一直找不到原因,后来通过这种日志输出,看到了JSessionId的一个数据变化的过程,得知由于flex编码中含有十六进制数,在我需要截取的参数前,有一串"\\x04\\x00\\x06",在获取参数时由于这一串数的影响无法获取到我所需要的值,所以后来就将web_reg_save_param函数中一个属性SaveOffset设置为4才得到了所需的字符串。
SaveOffset的用法为:当找到符合的动态数据时,从第几个字符开始才开始存储到参数中。此属性值不可为负数,其默认值为0。
4、另外一种设置方法可以使左右边界简单化
针对jsp页面中,如果要获取form中的某个属性的值,如下面这段代码:
<form method="post" name="frmLogout">
<div align="left">
<br>
业务号:
<input type="text" name="serviceId" size="100" maxlength="20"
value="">
<br>
XML数据:
<textarea name="data" rows="10" cols="100"></textarea>
<br>
<input type="submit" name="submit" value="提交"
onclick="dosubmit(1)">
<input type="submit" name="submit" value="取消"
onclick="dosubmit(2)">
<br>
sessionId:
<input type="text" name="sessionId" size="100" maxlength="20"
value="af0616ae-cbe7-412d-8965-1d33ba55fc3b">
<br>
</div>
</form>
想要截取到sessionId的value值,如果直接用左右边界截取,由于程序中的太多的value,所以需要截取左边界为name="sessionId" size="100" maxlength="20" value=",
由于此边界的内容显示时有换行,所以如果以上面那一段内容作为左边界的话可能会有截取不成功的情况,所以在这种情况下,我们可以采取以下方式:
web_reg_save_param("SessionId","LB=value=\"","RB=\">","ORD=5",LAST);
ORD可以定位整个数据中取第几个值
利用ORD属性,在左边界出现的第5次时再进行截取。如果不确定自己所要截取的这段字符串是在第几次出现,那么可以先将ORD设置为ALL,然后通过Extended log->Parameter subsitution日志,可以看到所有左右边界一致的截取的字符串数组,再确认自己所需截取的字符串是在这个数组中的第几个位置,将ORD设置为几即可。
5、如果某个参数关联成功,可是运行时却发现还会报错,那么可以考虑一下是不是因为有别的值跟你所截取的这个参数相关联,随着那个值的变化,你所截取的这个参数也会进行某一方面的变化,那样的话就需要将那个变化的值同样进行参数化。
6、如何打印出参数值
解决方法:利用lr_eval_string与lr_output_message这两个函数来打印出参数值。
例:lr_output_message("SessionId=%s",lr_eval_string("{ParameterName}"));
打印参数值这段代码所放的位置一定是在已经获取到参数值后,才可打印出来。
四、参数说明:
ParamName:存放动态数据的参数名称。
list of Attributes:其他属性,包含 “Notfound”、“LB”、“RB”、“RelFrameID”、“Search”、“ORD”、“SaveOffset”、“Convert”以及“SaveLen”。
下面将详细说明每个属性值的意义:
1、Notfound:指定当找不到要找的动态数据时该怎么处理。
当指定Notfound=error时,表示着找不到动态数据时,就发出一个错误消息。此为该属性的默认值。
当指定Notfound=warning时,表示当找不到动态数据时,不发出错误消息,只发出警告,脚本也会继续执行下去不会中断。在对脚本出错时,可以如此设置。
2、LB:动态数据的左边界字符串。此属性是必须要有的,而且区分大小写。
3、RB:动态数据的右边界字符串。此属性是必须要有的,而且区分大小写。
4、RelFrameID:相对于URL而言,欲搜寻的网页的Frame。此属性可以是All或是数字,而且可有可无。
5、Search:搜寻的范围,其值可以是Headers(只搜寻headers)、Body(只搜寻body部分,不搜寻header)、Noresource(只搜寻body部分,不搜寻header与resource)或是All(搜寻全部范围,此为默认值),此属性可有可无。
6、ORD:指明从第几次出现的左边界开始才是要撷取的数据,默认值是1。假如该属性值为All,则所有找到符合的数据会存储在数组中。此属性可有可无。
7、SaveOffset:当找到符合的动态数据时,从第几个字符开始才开始存储到参数中。此属性值不可为负数,其默认值为0。
8、Convert:转换数据格式。当指定该属性值为HTML_TO_URL时,意味着将HTML-encoded数据转成URL-encoded数据格式。如果是HTML_TO_TEXT,表示将HTML-encoded数据转成纯文字数据格式。
9、SaveLen:当找到匹配项后,偏移量之后的几个字元存储到参数中。此参数可有可无,默认值是-1,表示一直到结尾的整个字符串都存入参数中。
五、转义字符总结
在做手动关联时,取边界值的时候,会经常用到转义字符,现将转义字符整理如下:
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表
\v 垂直制表
\\ 反斜杠
\? 问号字符
\' 单引号字符
\" 双引号字符
\0 空字符