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文件中的资源。