Google的搜索框是典型的AJAX应用,用户在输入关键字的同时,前端页面通过xmlhttp与后台服务器动态交互,根据用户输入的关键字查找匹配的内容,向用户提示建议的搜索项,也就是所谓的“google suggest”。
如果使用LoadRunner进行测试,采用AJAX(Click and Script)协议录制的话会得到以下脚本:
Action()
{
web_add_cookie_ex("Cookie=PREF=ID=372e76ef6c7e842e:U=1961d03ffd7ab924:NW=1:TM=1264934277:LM=1264934316:S=OYfvCjRzGq1u4u4z; domain=google.cn; path=/", ENDITEM,
"Cookie=NID=31=hwv9eoM6IVUuD1ssILGftThmu8fjLzTdRUZXJTwcEggxBjCoy4Fh3dEsZVLVZ66_WndMz03It6xuCCWAqW28ZCj2r2wJxmfKM4_UHMZGk_mnybPjA6tDdB9HFqVkX1EU; domain=google.cn; path=/", ENDITEM,
"Cookie=SNID=31=BZul31Bwi_B97OMZlOIjZOeSm05tZw_9bw9T4zsT=kqUHVr3rOWtmkOvF; domain=google.cn; path=/verify", ENDITEM,
LAST);
web_browser("www.google.cn",
DESCRIPTION,
ACTION,
"Navigate=http://www.google.cn/",
LAST);
web_edit_field("q",
"Snapshot=t1.inf",
DESCRIPTION,
"Type=text",
"Name=q",
ACTION,
"SetValue=AJAX",
LAST);
web_button("INPUT",
"Snapshot=t2.inf",
DESCRIPTION,
"Type=submit",
"Tag=INPUT",
"ID=",
"Value=Google 搜索",
ACTION,
"UserAction=Click",
LAST);
return 0;
}
可以看到google suggest的AJAX行为并没有被录制下来,从回放日志的服务器返回记录中也找不到google suggest返回结果的踪影。
采用WEB(HTTP/HTML)协议来录制,则得到下面的脚本:
Action()
{
web_add_cookie("PREF=ID=372e76ef6c7e842e:U=1961d03ffd7ab924:NW=1:TM=1264934277:LM=1264934316:S=OYfvCjRzGq1u4u4z; DOMAIN=www.google.cn");
web_add_cookie("NID=31=hwv9eoM6IVUuD1ssILGftThmu8fjLzTdRUZXJTwcEggxBjCoy4Fh3dEsZVLVZ66_WndMz03It6xuCCWAqW28ZCj2r2wJxmfKM4_UHMZGk_mnybPjA6tDdB9HFqVkX1EU; DOMAIN=www.google.cn");
web_url("www.google.cn",
"URL=http://www.google.cn/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTML",
EXTRARES,
"Url=/extern_js/f/CgV6aC1DThICY24rMAo4V0ACLCswDjgLLCswETgVLCswFjgXLCswFzgFLCswGDgFLCswGTgTLCswJTjKiAEsKzAmOAksKzAnOAQsKzA8OAIsKzBEOAEsKzBFOAEs/qft1hKbTw2Q.js", ENDITEM,
"Url=/favicon.ico", "Referer=", ENDITEM,
"Url=/intl/zh-CN/images/toolbar_animation_20090618.png", ENDITEM,
"Url=/complete/search?hl=zh-CN&xhr=t&q=A&cp=1", ENDITEM,
"Url=/complete/search?hl=zh-CN&xhr=t&q=AJ&cp=2", ENDITEM,
"Url=/complete/search?hl=zh-CN&xhr=t&q=AJA&cp=3", ENDITEM,
"Url=/complete/search?hl=zh-CN&xhr=t&q=AJAX&cp=4", ENDITEM,
LAST);
web_url("csi",
"URL=http://www.google.cn/csi?v=3&s=webhp&action=&e=17259,23361,23603&ei=kMFrS-GQB8qNkAWljIX6AQ&expi=17259,23361,23603&imc=2&imn=2&imp=2&rt=prt.110,xjsls.125,ol.437,iml.250,xjses.437,xjsee.468,xjs.500",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/",
"Mode=HTML",
LAST);
web_url("search",
"URL=http://www.google.cn/search?hl=zh-CN&source=hp&q=AJAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/",
"Snapshot=t2.inf",
"Mode=HTML",
LAST);
web_url("gen_204",
"URL=http://www.google.cn/gen_204?mgmhp=shp1&ct=v&cd=false",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/search?hl=zh-CN&source=hp&q=AJAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Mode=HTML",
LAST);
web_url("csi_2",
"URL=http://www.google.cn/csi?v=3&s=web&action=&e=17259,23361,23603&ei=msFrS5anH8qGkAX5rJDwAw&expi=17259,23361,23603&imc=1&imn=1&imp=1&rt=prt.125,ol.343,iml.156,xjses.375,xjsee.390,xjsls.390,xjs.437",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/search?hl=zh-CN&source=hp&q=AJAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Mode=HTML",
LAST);
return 0;
}
google suggest的行为被录制到第一个web_url的请求中,被作为资源进行HTTP请求。Web_url函数中的EXTRARES表示表示后面的url所指的内容都是作为资源来请求的,LR的帮助文档中是这样说的:
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).
如果想把google suggest的行为分别录制成一个个的web_url请求,则需要修改录制模式,改为用“URL-Based”模式录制:
Action()
{
web_add_cookie("PREF=ID=372e76ef6c7e842e:U=1961d03ffd7ab924:NW=1:TM=1264934277:LM=1264934316:S=OYfvCjRzGq1u4u4z; DOMAIN=www.google.cn");
web_add_cookie("NID=31=hwv9eoM6IVUuD1ssILGftThmu8fjLzTdRUZXJTwcEggxBjCoy4Fh3dEsZVLVZ66_WndMz03It6xuCCWAqW28ZCj2r2wJxmfKM4_UHMZGk_mnybPjA6tDdB9HFqVkX1EU; DOMAIN=www.google.cn");
web_url("www.google.cn",
"URL=http://www.google.cn/",
"Resource=0",
"RecContentType=text/html",
"Referer=",
"Snapshot=t1.inf",
"Mode=HTTP",
LAST);
web_concurrent_start(NULL);
web_url("logo_cn.gif",
"URL=http://www.google.cn/intl/zh-CN/images/logo_cn.gif",
"Resource=1",
"RecContentType=image/gif",
"Referer=http://www.google.cn/",
"Snapshot=t2.inf",
LAST);
web_url("cn_icp.gif",
"URL=http://www.google.cn/intl/zh-CN_cn/images/cn_icp.gif",
"Resource=1",
"RecContentType=image/gif",
"Referer=http://www.google.cn/",
"Snapshot=t3.inf",
LAST);
web_concurrent_end(NULL);
web_concurrent_start(NULL);
web_url("qft1hKbTw2Q.js",
"URL=http://www.google.cn/extern_js/f/CgV6aC1DThICY24rMAo4V0ACLCswDjgLLCswETgVLCswFjgXLCswFzgFLCswGDgFLCswGTgTLCswJTjKiAEsKzAmOAksKzAnOAQsKzA8OAIsKzBEOAEsKzBFOAEs/qft1hKbTw2Q.js",
"Resource=1",
"RecContentType=text/javascript",
"Referer=http://www.google.cn/",
"Snapshot=t4.inf",
LAST);
web_url("nav_logo7.png",
"URL=http://www.google.cn/images/nav_logo7.png",
"Resource=1",
"RecContentType=image/png",
"Referer=http://www.google.cn/",
"Snapshot=t5.inf",
LAST);
web_url("favicon.ico",
"URL=http://www.google.cn/favicon.ico",
"Resource=1",
"RecContentType=image/x-icon",
"Referer=",
"Snapshot=t6.inf",
LAST);
web_concurrent_end(NULL);
web_url("csi",
"URL=http://www.google.cn/csi?v=3&s=webhp&action=&e=17259,23361,23603&ei=9MRrS62DC8yTkAX285SPAw&expi=17259,23361,23603&imc=2&imn=2&imp=2&rt=prt.94,xjsls.109,ol.437,iml.328,xjses.452,xjsee.484,xjs.515",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/",
"Mode=HTTP",
LAST);
web_concurrent_start(NULL);
web_url("toolbar_animation_20090618.png",
"URL=http://www.google.cn/intl/zh-CN/images/toolbar_animation_20090618.png",
"Resource=1",
"RecContentType=image/png",
"Referer=http://www.google.cn/",
"Snapshot=t7.inf",
LAST);
web_url("search",
"URL=http://www.google.cn/complete/search?hl=zh-CN&xhr=t&q=A&cp=1",
"Resource=1",
"RecContentType=application/json",
"Referer=http://www.google.cn/",
"Snapshot=t8.inf",
LAST);
web_url("search_2",
"URL=http://www.google.cn/complete/search?hl=zh-CN&xhr=t&q=Aj&cp=2",
"Resource=1",
"RecContentType=application/json",
"Referer=http://www.google.cn/",
"Snapshot=t9.inf",
LAST);
web_url("search_3",
"URL=http://www.google.cn/complete/search?hl=zh-CN&xhr=t&q=AjA&cp=3",
"Resource=1",
"RecContentType=application/json",
"Referer=http://www.google.cn/",
"Snapshot=t10.inf",
LAST);
web_url("search_4",
"URL=http://www.google.cn/complete/search?hl=zh-CN&xhr=t&q=AjAX&cp=4",
"Resource=1",
"RecContentType=application/json",
"Referer=http://www.google.cn/",
"Snapshot=t11.inf",
LAST);
web_concurrent_end(NULL);
lr_think_time(14);
web_url("search_5",
"URL=http://www.google.cn/search?hl=zh-CN&source=hp&q=AjAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/",
"Snapshot=t12.inf",
"Mode=HTTP",
LAST);
web_url("nav_logo7.png_2",
"URL=http://www.google.cn/images/nav_logo7.png",
"Resource=1",
"RecContentType=image/png",
"Referer=http://www.google.cn/search?hl=zh-CN&source=hp&q=AjAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Snapshot=t13.inf",
LAST);
web_url("gen_204",
"URL=http://www.google.cn/gen_204?mgmhp=shp1&ct=v&cd=false",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/search?hl=zh-CN&source=hp&q=AjAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Mode=HTTP",
LAST);
web_url("csi_2",
"URL=http://www.google.cn/csi?v=3&s=web&action=&e=17259,23361,23603&ei=BMVrS-fpFMqGkAWXrpzwAw&expi=17259,23361,23603&imc=1&imn=1&imp=0&rt=prt.468,ol.499,iml.468,xjses.546,xjsee.561,xjsls.561,xjs.608",
"Resource=0",
"RecContentType=text/html",
"Referer=http://www.google.cn/search?hl=zh-CN&source=hp&q=AjAX&btnG=Google+%E6%90%9C%E7%B4%A2&aq=f&oq=",
"Mode=HTTP",
LAST);
return 0;
}
这样录制下来的脚本会长很多。Google suggest的AJAX行为被分别录制成一个个的web_url请求,并且放在web_concurrent_start和web_concurrent_end之间。关于web_concurrent_start函数的描述,可以参考LR帮助文档:
The web_concurrent_start function marks the beginning of a concurrent group. All functions within the group are executed concurrently. The end of the group is marked by the web_concurrent_end function. Within the concurrent group, you may include Action functions and several Service functions.
Note that the functions included within the concurrent group are not executed immediately. Instead they are registered for concurrent execution. When the concurrent group is closed, all of the functions registered as concurrent are executed together.
Concurrent中的函数都会先注册,而不是马上执行,直到web_concurrent_end才一起执行,这个从回放的日志也可以看出来:
Action.c(73): web_concurrent_start was successful [MsgId: MMSG-26392]
Action.c(75): Registering web_url("toolbar_animation_20090618.png") was successful [MsgId: MMSG-26390]
Action.c(83): Registering web_url("search") was successful [MsgId: MMSG-26390]
Action.c(91): Registering web_url("search_2") was successful [MsgId: MMSG-26390]
Action.c(99): Registering web_url("search_3") was successful [MsgId: MMSG-26390]
Action.c(107): Registering web_url("search_4") was successful [MsgId: MMSG-26390]
Action.c(115): web_concurrent_end was successful, 8506 body bytes, 1355 header bytes, 84 chunking overhead bytes [MsgId: MMSG-26385]
再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow