【转载】LR - 细节解析,为什么LR脚本会去访问“脚本中不存在的“资源?
问题描述
同事遇到的一个问题,LR执行性能测试脚本时,总报出错误,无法访问一个图片的地址,但脚本中明明没有对该资源的请求。
Action4.c(12): Warning -27796: Failed to connect to server "10.11.204.35:80": [10060] Connection timed out [MsgId: MWAR-27796]
Action4.c(12): Warning -26000: Empty or no response for URL="http://10.11.204.35/iwebfiles/yqlj/26/107/10/4/361.gif" [MsgId: MWAR-26000]
我查了一下,确实脚本中看不出问题,所有不相干的请求都删掉了,页面的请求中EXTRARES属性中的资源列表也都删掉了,只保留了主页面的请求。但只要一执行,就会去访问那个无法连接的资源。
分析与实验
查看了该页面的源文件,确实可以看到那个有问题的图片链接,是写在一个表格里的。于是很自然的猜测,是不是表格中的资源,录制不到脚本中、但是又访问了呢?
这种问题,其实确信只要把录制方式转换为URL-Based Mode就肯定能解决,因为可以显式的录下所有请求。但还是想把HTML-Based Mode下的问题解决,于是做了一些测试。
模拟那个问题页面,创建测试用页面。特意写了两个图片资源做对比,一个普通的图片,一个是放置在表格中的图片超链接,测试访问这个页面录制的脚本。
<html> <head> <meta http-equiv="content-type" content="text/html;charset=gb2312"> <title>测试页面</title> </head> <body> <p> 普通的图片 <img src="http://172.16.1.3/bbs/attachments/month_1110/20111008_3f1828e9b28294cb7f23Wu3TykOUV9RM.jpg" width="126" height="45" border="0"/> </p> <p> <table border=2> <tr> <td> 表格中的图片跳转链接 </td> </tr> <tr> <td> <a href="http://172.16.1.3/bbs/viewthread.php?tid=44597&extra=page%3D1###zoom" target="_blank"><img src="http://172.16.1.3/bbs/attachments/month_1110/20111008_67cebe2ca85b66fe580cGUGESOM05AWo.jpg" width="126" height="45" border="0"/></a> </td> </tr> </table> </p> </body></html> |
创建如上的HTML,放到TOMCAT的ROOT目录中,则可以通过tomcat访问该页面。
测试:
1.
默认的HTML-Based Mode方式进行录制,只录到一个请求。

web_url("test_mode.html",
"URL=http://172.16.6.17:8080/test_mode.html",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t12.inf",
"Mode=HTML",
LAST);

脚本中看不到对资源的请求,但实际运行时,还是会去获取两个图片资源。通过Replay Log可以看到请求的证据:
Action_HTML.c(7): Found resource "http://172.16.1.3/bbs/attachments/month_1110/20111008_3f1828e9b28294cb7f23Wu3TykOUV9RM.jpg" in HTML "http://172.16.6.17:8080/test_mode.html" [MsgId: MMSG-26659]
Action_HTML.c(7): Found resource "http://172.16.1.3/bbs/attachments/month_1110/20111008_67cebe2ca85b66fe580cGUGESOM05AWo.jpg" in HTML "http://172.16.6.17:8080/test_mode.html" [MsgId: MMSG-26659]
2.
URL-Based Mode录制方式,可以录制到所有的请求,包括一个页面请求,两个图片请求。

web_url("test_mode.html",
"URL=http://172.16.6.17:8080/test_mode.html",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t13.inf",
"Mode=HTTP",
LAST);
web_concurrent_start(NULL);
web_url("20111008_3f1828e9b28294cb7f23Wu3TykOUV9RM.jpg",
"URL=http://172.16.1.3/bbs/attachments/month_1110/20111008_3f1828e9b28294cb7f23Wu3TykOUV9RM.jpg",
"Resource=1",
"RecContentType=image/jpeg",
"Referer=http://172.16.6.17:8080/test_mode.html",
"Snapshot=t14.inf",
LAST);
web_url("20111008_67cebe2ca85b66fe580cGUGESOM05AWo.jpg",
"URL=http://172.16.1.3/bbs/attachments/month_1110/20111008_67cebe2ca85b66fe580cGUGESOM05AWo.jpg",
"Resource=1",
"RecContentType=image/jpeg",
"Referer=http://172.16.6.17:8080/test_mode.html",
"Snapshot=t15.inf",
LAST);
web_concurrent_end(NULL);

对比两种录制方式可以发现,对主页面的请求,两个脚本的唯一差别就在Mode属性为"HTML"还是"HTTP"(代码中标记黄色处)。通过修改测试1(HTML-Based Mode),可以很容易的获得以下信息:
如果MODE="HTML",那么访问页面的请求,会自动去请求页面上的资源。
如果MODE="HTTP",那么会只请求这个页面的HTML文件。
但熟悉LR的人又肯定记得,在默认的HTML-Based Mode录制模式下,web_url脚本中应该会记录所请求的资源文件啊?在EXTRARES属性后经常会看到"Url=/image/test.jpg"这样的语句,那为什么出现问题的那个页面,和我们的测试页面录下来的脚本确实没记录资源文件呢?
要查明这点很容易,只要随便找一个网站录制一下,去看看脚本中记录的资源文件有什么特点就知道了。
用我们公司的搜索平台做一下实验,录制主页面如下。果然得到了我们期望的EXTRARES属性,下面列出了很多资源文件。

web_url("search.thunisoft.com",
"URL=http://search.thunisoft.com/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t16.inf",
"Mode=HTML",
EXTRARES,
"Url=/skins/default/images/bg_top.gif", ENDITEM,
"Url=/skins/default/images/nav_bg.gif", ENDITEM,
"Url=/skins/default/images/nav_right.jpg", ENDITEM,
"Url=/skins/default/images/search_m.gif", ENDITEM,
"Url=/skins/default/images/button02.gif", ENDITEM,
"Url=/skins/default/images/nav_r.gif", ENDITEM,
"Url=/skins/default/images/button01.gif", ENDITEM,
"Url=/skins/default/images/nav_l.gif", ENDITEM,
"Url=/skins/default/images/search_l.gif", ENDITEM,
"Url=/skins/default/images/search_r.gif", ENDITEM,
LAST);

分析一下页面的源文件,搜索脚本中出现的各个图片名,居然发现一个都找不到!而源文件中出现的图片文件,在脚本中又都没记录。
那么继续寻找脚本中图片的来源吧。其实到这应该很自然的想到了CSS文件了吧,于是随着源文件中的<link>找到连接文件,果然EXTRARES中的所有资源文件都找到了。
结论
到这里结论其实也就出来了。(结论只针对HTML-Based Mode录制方式)
HTML页面中的资源,如页面里写的<img>(跟是不是在表格中无关...),是不会显示在脚本中的。
而外部链接中的资源,如<link type="text/css>连接的CSS文件中使用的图片,是会通过EXTRARES属性显示在脚本中的。
运行上面这个脚本,Replay Log中会显示:

Action3.c(8): Downloading resource "http://search.thunisoft.com/skins/default/images/bg_top.gif" (specified by argument number 9) [MsgId: MMSG-26577]
Action3.c(8): Downloading resource "http://search.thunisoft.com/skins/default/images/nav_bg.gif" (specified by argument number 11) [MsgId: MMSG-26577]
Action3.c(8): Downloading resource "http://search.thunisoft.com/skins/default/images/nav_right.jpg" (specified by argument number 13) [MsgId: MMSG-26577]
Action3.c(8): Downloading resource "http://search.thunisoft.com/skins/default/images/search_m.gif" (specified by argument number 15) [MsgId: MMSG-26577]
Action3.c(8): Downloading resource "http://search.thunisoft.com/skins/default/images/button02.gif" (specified by argument number 17) [MsgId: MMSG-26577]
Action3.c(8): Downloading resource "http://search.thunisoft.com/skins/default/images/nav_r.gif" (specified by argument number 19) [MsgId: MMSG-26577]
Action3.c(8): Downloading resource "http://search.thunisoft.com/skins/default/images/button01.gif" (specified by argument number 21) [MsgId: MMSG-26577]
Action3.c(8): Downloading resource "http://search.thunisoft.com/skins/default/images/nav_l.gif" (specified by argument number 23) [MsgId: MMSG-26577]
Action3.c(8): Downloading resource "http://search.thunisoft.com/skins/default/images/search_l.gif" (specified by argument number 25) [MsgId: MMSG-26577]
Action3.c(8): Downloading resource "http://search.thunisoft.com/skins/default/images/search_r.gif" (specified by argument number 27) [MsgId: MMSG-26577]

细心的人可以发现,这个日志和第一步实验中的不一样呢。再次对比上面写出的两种Replay Log,可以发现一个是"Found resource ... in HTML ...",一个是"Downloading resource ..."(标记蓝色两处)
这样也可以解释了。
HTML文件内部的资源,不需要显示在脚本中就可以下载,因为会在访问这个页面时“发现”。
而外部链接的资源,必须在脚本中显式写出,才会去“下载”。
所以EXTRARES属性下面的资源,只要注释掉相应的脚本,就可以避免该请求。
而HTML页面文件中的资源,则只能通过修改MODE="HTTP"属性,或者改为URL-Based Mode录制方式,才能避免请求。
说到这,基本都清楚了,最后再翻一下官方文档(Function Reference)吧。

web_url EXTRARES:
A demarcation parameter indicating that the next parameter will be a list of resource attributes. List of Resource Attributes:
A list of resources generated by non–HTML mechanisms in the Web page. These include the resources requested by Javascript, ActiveX, Java applets and Flash. VuGen's Recording Options allow these elements either to be recorded within the current script step (the default mode) or recorded as separate steps (see "Recording in HTML–Based Mode" in the VuGen Online Book).

再次验证了我们的结论,EXTRARES中只显示非HTML文件中的资源。
作者:薛定谔的破猫
【转载】LR - 细节解析,为什么LR脚本会去访问“脚本中不存在的“资源?的更多相关文章
- 【Unity】6.3 通过 C# 脚本创建和访问游戏对象
分类:Unity.C#.VS2015 创建日期:2016-04-16 一.简介 在游戏开发过程中,脚本不但需要访问脚本所在的游戏对象的组件,还经常需要访问和控制真他游戏对象.另外,根据项目需求,还可能 ...
- GBDT+LR算法解析及Python实现
1. GBDT + LR 是什么 本质上GBDT+LR是一种具有stacking思想的二分类器模型,所以可以用来解决二分类问题.这个方法出自于Facebook 2014年的论文 Practical L ...
- 【转载】全面解析Unity3D自动生成的脚本工程文件
我们在Unity3D开发的时候,经常会看到它会产生不少固定命名工程文件,诸如: Assembly-CSharp-vs.csproj Assembly-CSharp-firstpass-vs.csp ...
- LR日志解析
在录制和回放的时候,VU会分别把发生的事件记录成日志文件,这些日志有利于我们跟踪VU和服务器的交互过程. 1.回放日志(Replay log) 脚本回放运行时的输出都记在这个log里. "输 ...
- [转载]ECMall模板解析语法与机制
ECMall模板解析语法与机制 2011-05-22 在ECMall模板中,用"{"开头,以"}"结尾就构成一个标签单元,"{"紧接着的单词 ...
- (转载)深入解析String#intern
本文转载自:深入解析String#intern 引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念. ...
- 基于Hi3559AV100 RFCN实现细节解析-(2)RFCN数据流分析
下面随笔系列将对Hi3559AV100 RFCN实现细节进行解析,整个过程涉及到VI.VDEC.VPSS.VGS.VO.NNIE,其中涉及的内容,大家可以参考之前我写的博客: Hi3559AV100的 ...
- 基于Hi3559AV100 RFCN实现细节解析-(3)系统输入VI分析一 :
下面随笔系列将对Hi3559AV100 RFCN实现细节进行解析,整个过程涉及到VI.VDEC.VPSS.VGS.VO.NNIE,其中涉及的内容,大家可以参考之前我写的博客: Hi3559AV100的 ...
- 基于Hi3559AV100 RFCN实现细节解析-(3)系统输入VI分析(HiISP)二 :
下面随笔系列将对Hi3559AV100 RFCN实现细节进行解析,整个过程涉及到VI.VDEC.VPSS.VGS.VO.NNIE,其中涉及的内容,大家可以参考之前我写的博客: 基于Hi3559AV10 ...
随机推荐
- [9018_1963][IOI_1998]Picture
题目描述 N(N<5000) 张矩形的海报,照片和其他同样形状的图片贴在墙上.它们的边都是垂直的或水平的.每个矩形可以部分或者全部覆盖其他矩形.所有的矩形组成的集合的轮廓称为周长.写一个程序计算 ...
- 【数据库】E-R模型
E-R模型 实体:客观存在并可相互区别的事物称为实体.可以是具体的人.事.物或抽象的概念. 属性:实体所具有的某一特性称为属性.一个实体可以由若干个属性来刻画. 联系:现实世界中事物内部以及事物之间的 ...
- Java反射常用API汇总
“JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性” 一.类对象的获取 1.通过对象获取 Object obj = ne ...
- Fiddler抓包2-只抓APP的请求【转载】
本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/p/6582437.html 前言 fiddler抓手机app的请求,估计大部分都会,但是如何只 ...
- jsp/el和jstl动态页面
一.JSP技术 1.jsp脚本和注释 jsp脚本: 1)<%java代码%> ----- 内部的java代码翻译到service方法的内部 2)<%=java变量或表达式> - ...
- yum安装jdk环境变量配置
系统版本 [root@localhost ~]# cat /etc/redhat-release CentOS Linux release (Core) #安装之前先查看一下有无系统自带jdk rpm ...
- 详解TCP的三次握手四次断开
本文将分别讲解经典的TCP协议建立连接(所谓的“3次握手”)和断开连接(所谓的“4次挥手”)的过程. 尽管TCP和UDP都使用相同的网络层(IP),TCP却向应用层提供与UDP完全不同的服务.TCP提 ...
- 漂亮的弹窗口插件——sweetAlert的使用
想必你已经受够了单调的alert弹窗吧? 为了更好的用户体验性,现在介绍一款漂亮的弹窗口插件——sweetAlert,现在就来介绍它的使用 1.首先在官网下载它的CSS和JavaScript文件:ht ...
- Delphi 7 在程序中直接执行SQL脚本文件
Delphi 7 在程序中直接执行SQL脚本文件 在处理MSDE一些操作中.需要执行一些SQL脚本.有的是从SQLServer 2000中生成的SQL为后缀的脚本.在MSDE中没有企业管理器,操作都是 ...
- HDU 17新生赛 身份证验证【模拟】
身份证验证 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submi ...