所谓的关联就是把脚本中某些写死的代码(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 空字符

LoadRunner手动设置关联时关联结果的值为空

使用LoadRunner录制脚本时,许多应用程序都使用动态值,每次使用应用程序时这些值都会发生变化。LoadRunner通过关联解决这种问题,关联将动态值保存到参数中。

下面进行手动设置关联时,出现关联结果的值为空:

原因在于:

设置关联有手动关联和自动关联两种方式,LoadRunner安装的时候默认选择了自动关联方式,导致关联结果的值为空。

点击工具------>录制选项------>取消勾选【在录制期间启用关联】

然后重新录制一下脚本,按照之前的方法手动关联结果就可以了。如图,录制快照中的文本 和回放快照中的文本数据不一样,所以我们手动选择它们进行关联。

手动关联完成后,脚本里就会生成关键函数。

执行再次回放操作,即可回放成功。

LR手动关联参数化问题总结的更多相关文章

  1. LR手动关联新手总结

    最近学习LoadRunner的时候深刻体会:新手入门真心不容易啊 今天一直在纠结LoadRunner的手动关联问题,之前刚开始看书的时候就看到了,不过当时想先放放,后面来细细研究, 今天看的时候在网上 ...

  2. 如何做LR自动关联和手动关联?

    一.什么时候需要关联   1.关联的含义        关联的含义A(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容 ...

  3. LoadRunner脚本参数化之自动关联和手动关联

    一.关联的意义  1.关联的含义 关联(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到相应的值,以变量的 ...

  4. LR设置关联---部分内容摘自网络--望见谅

    模拟环境---LR机票定票系统设置:首页点击administration-勾选Set LOGIN form's action tag to an error page.选项,点击update. 现在许 ...

  5. Loadrunner--自动关联和手动关联

    2017-06-09 15:32:45个人也属于刚刚开始学习,有什么不对的地方敬请指导:qq:389791447 一开始的时候,准备去学习怎么去关联.一时也毛不着头脑,就在网上找了一些视频看,有的人说 ...

  6. 【Loadrunner】Loadrunner 手动关联技术

    Loadrunner 手动关联技术 录制成功,回放失败,怀疑和动态数据有关: 1 重新录制一份脚本,两次录制的脚本进行比对,确定动态数据,复制动态数据: 2  找到第一次产生该动态数据的响应对应的相应 ...

  7. LoadRunner-关联(自动关联和手动关联)

    使用LR录制脚本,新建课程:每次新建课程都会产生一个新的courseid和partid,直接使用录制的脚本执行是不行的.所以用到了关联. 注:关联分手动和自动关联,自动关联搜索出一些不必要关联的数据, ...

  8. Loadrunner手动关联详解

    Loadrunner手动关联详解 一.关联的含义: 关联(correlation):在脚本回放过程中,客户端发出请求,通过关联函数所定义的左右边界值(也就是关联规则),在服务器所响应的内容中查找,得到 ...

  9. LoadRunner脚本增强技巧之手动关联

    个人认为LoadRunner的手动关联技巧可以看做参数化的一种,区别在与获取参数的来源不同. 一般的参数化:把脚本中一个写死的数值或者字符串用一个变量参数来代替,每次迭代的时候,从本地文件或者数据库中 ...

随机推荐

  1. oracle如何设置最大连接数

    查看session: select * from v$session where username is not null select username,count(username) from v ...

  2. 522 Longest Uncommon Subsequence II 最长特殊序列 II

    详见:https://leetcode.com/problems/longest-uncommon-subsequence-ii/description/ C++: 方法一: class Soluti ...

  3. 165 Compare Version Numbers 比较版本号

    比较两个版本号 version1 和 version2.如果 version1 大于 version2 返回 1,如果 version1 小于 version2 返回 -1, 除此以外 返回 0.您可 ...

  4. 01.第一章_C++ Primer学习笔记_开始

    1.2 初始输入输出 iostream库里面包含两个基础类型istream和ostream,分别表示输入流和输出流,一个流就是一个字符序列,从IO设备读出或者写入IO设备. 标准的输入输出对象 标准库 ...

  5. ES-自然语言处理

    前言 自然语言处理(Natural Language Processing)是计算科学领域与人工智能领域中的一个重要方向.它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法.自然语言处理 ...

  6. Java报表之JFreeChart

    一.JFreeChart简介 JFreeChart是JAVA平台上的一个开放的图表绘制类库.它完全使用JAVA语言编写,是为applications,servlets以及JSP等使用所设计. JFre ...

  7. 关于Android发送短信获取送达报告的问题

    最近公司开发一个项目,要求app能够发送短信并获取送达报告.这本不是一个什么难题,实现这一功能的代码一搜一大把,那么这么简单的一个问题,为什么我要在这里提出来呢?那是因为我在写代码的时候掉入了一个坑, ...

  8. C# 调用第三方DLL缓冲区溢出导致的异常

    这个倒是少见的错误,纪录一下大佬. 先上异常 错误一:尝试读取或写入受保护的内存 错误二:未将对象引用设置到对象的实例 错误三:  托管调试助手“FatalExecutionEngineError”( ...

  9. Python100天打卡-Day10-图形用户界面和游戏开发

    基于tkinter模块的GUIPython默认的GUI开发模块是tkinter(在Python 3以前的版本中名为Tkinter)使用tkinter来开发GUI应用需要以下5个步骤: 导入tkinte ...

  10. Dart开发环境搭建

    一.SDK的安装与环境配置 1. 下载Dark SDK http://www.gekorm.com/dart-windows/ 2.  安装SDK 3.  配置环境变量(一般已经默认生成好了,这里可以 ...