loadrunner---<二>---菜鸟对cookie的思考
lr是怎么将cookie添加到录制的脚本中的?lr中cookie是做什么的?
首先将解决两个疑问:
1--什么是cookie?--
Cookie是网站放置在硬盘上的程序。它们驻留在计算机上,用于收集有关您和您在互联网上执行的任何操作的信息,只要网站需要,就可以下载此Cookie收集的所有信息。
这些cookie是一些简单的文本文件,里面记录的内容一般是网站经过某些规则加密的文本。那这些文本都记录了什么?(以下是个人理解)这些cookie记录的一般是用户的相关信息,用户id,密码,session id,以及用户登录这个网站经常浏览的连接(再次登录时,网站会根据记录用户个人偏好的cookie,针对不同的用户,登录同一个网站,返回的页面有肯能是不同的,例如,申请了百度账号,并登陆过,再次登录百度 。还有一个现象,当我在购物网站浏览过一些商品时,退出购物网站,然后在浏览其他网页的时候,经常会有一些浮动的小广告,这些广告恰巧就是我关心的商品。
这些cookie文件放在了什么地方?假若你使用的是ie浏览器,工具->internet选项->常规->浏览器记录->设置->查看文件。打开的这个文件里面存放着你浏览过的网站在你的电脑里保存的cookie文件以及你的浏览器缓存的东西。存放目录一般为:C:\Documents and Settings\用户\Cookie
这些cookie文件是什么样子的?打开Cookie文件,名称大多是这样的:cookie:用户@cnblogs.com/(这个为博客园留在我的电脑里的cookie文件),类型为文本文件。双击打开,里面是写文本,只不过看不懂。
如果删除了这些cookie?如果用户设置了浏览器记历史录为:退出时删除。那么当你关闭ie时,里面的缓存内容就会被清除掉,若不删除,缓存多了,所占空间就越大,多以,及时删除缓存是必要的。删除cookie后,在登陆一些网站后,就是你第一次访问这个网站的情形一样,没有为你添好的用户名,曾经设置了自动登录,登陆时也不会重新登录了。
2--cookie是怎么工作的?--
详解参考:http://www.elecfans.com/dianzichangshi/2009080483037.html
http://baike.baidu.com/view/835.htm
登陆网站的时候,网站是如何获取它保留在电脑里的cookie的?
如果在浏览器中键入URL = http://mail.163.com,浏览器是如何访问到这个网页的?浏览器不仅仅是只是发送了这个访问页面的请求,他还将这个网站留在电脑中的某些cookie一并的发送给http://mail.163.com这个网站:这些cookie加在了http请求的消息头中。以loadrunner录制163的邮箱登陆为例:
下面的这个请求是,loadrunner录制的登陆mail.163.com http请求的消息头,里面包含了浏览器从本地读取的cookie
GET / HTTP/1.1 Accept: */* Accept-Language: zh-cn User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) Accept-Encoding: gzip, deflate Host: mail.163.com Connection: Keep-Alive Cookie: nts_mail_user=163useraccount:-1:1; mail_popup=; _ntes_nnid=; _ntes_nuid=; P_INFO=163useraccount@163.com|-|0|mail163|11&19|bej&1-&mail163#bej&null#10#0#0|-; USERTRACK=1-------
(个人观点)在使用loadrunner录制脚本的时候为什么会录到 wed_add_cookie这些东西?loadrunner录制时,当检测到并记录http请求消息头中携带的cookie,然后在生成脚本的时候,将记录的这些cookie添加在对应这个http请求前面。在generation log中,http请求响应结束后会有log message,在logmessage后面记录了lr在脚本中加入cookie的痕迹
****** Start Log Message ****** Start Frames Hierarchy Tree Dump The Node has no URL End Frames Hierarchy Tree Dump $$$$$$ End Log Message $$$$$$ ****** Add Event For Transaction With Id 5 ****** (Location Flag : tFlagInsertEnd, Location ID : 5) web_url("mail.163.com", "URL=http://mail.163.com/", "TargetFrame=", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t1.inf", "Mode=HTML", LAST); $$$$$$ Add Event For Transaction With Id 5 Ended $$$$$$ ****** Add Event For Transaction With Id 0 ****** (Location Flag : tFlagInsertBefore, Location ID : 5) web_add_cookie("nts_mail_user=------:-1:1; DOMAIN=mail.163.com"); $$$$$$ Add Event For Transaction With Id 0 Ended $$$$$$ ****** Add Event For Transaction With Id 0 ****** (Location Flag : tFlagInsertBefore, Location ID : 5) web_add_cookie("mail_popup=----; DOMAIN=mail.163.com"); $$$$$$ Add Event For Transaction With Id 0 Ended $$$$$$ ****** Add Event For Transaction With Id 0 ****** (Location Flag : tFlagInsertBefore, Location ID : 5) web_add_cookie("_ntes_nnid=------; DOMAIN=mail.163.com"); $$$$$$ Add Event For Transaction With Id 0 Ended $$$$$$ ****** Add Event For Transaction With Id 0 ****** (Location Flag : tFlagInsertBefore, Location ID : 5) web_add_cookie("_ntes_nuid=-------; DOMAIN=mail.163.com"); $$$$$$ Add Event For Transaction With Id 0 Ended $$$$$$ ****** Add Event For Transaction With Id 0 ****** (Location Flag : tFlagInsertBefore, Location ID : 5) web_add_cookie("P_INFO=----------; DOMAIN=mail.163.com"); 。。。 。。。。
cookie是如何被浏览器保存在本地的?cookie是通过网站的http响应头携带,网站把他希望存放的信息通过set-cookie的方式保存在用户本地
****** Response Header For Transaction With Id 57 ****** HTTP/1.1 200 OK Cache-Control: max-age=0 Content-Length: 11245 Content-Type: text/html; charset=utf-8 Expires: Fri, 16 Nov 2012 03:29:48 GMT Server: Microsoft-IIS/7.5 P3P: CP="DSP CUR OTPi IND OTRi ONL FIN" X-XSS-Protection: 0 X-Content-Type-Options: nosniff Set-Cookie: MSPRequ=lt=----&co=1&id=64855; path=/;version=1 X-Frame-Options: deny PPServer: PPV: 30 H: BAYIDSLGN1E39 V: 0 Date: Fri, 16 Nov 2012 03:30:48 GMT Connection: close $$$$$$ Response Header For Transaction With Id 57 Ended $$$$$$
****** Response Header For Transaction With Id 75 ****** HTTP/1.1 200 OK Server: nginx Date: Fri, 16 Nov 2012 03:32:16 GMT Content-Type: text/html; charset=utf-8 Content-Length: 279 Connection: keep-alive Cache-Control: private P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR Set-Cookie: SID=-----; domain=reg.163.com; path=/ Set-Cookie: JSESSIONID=----; path=/ Cache-Control: max-age=0 $$$$$$ Response Header For Transaction With Id 75 Ended $$$$$$
既然浏览器会从本地读取cookie那么,lr为什么还要在录制的脚本中添加web_add_cookie?做个试验,清除所有的cookie文件,然后录制www.mail.163的邮箱登陆
这时lr录制的访问www.163.com的http消息头中是没有cookie的
****** Request Header For Transaction With Id 5 ****** GET / HTTP/1.1 Accept: */* Accept-Language: zh-cn User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729) Accept-Encoding: gzip, deflate Host: mail.163.com Connection: Keep-Alive $$$$$$ Request Header For Transaction With Id 5 Ended $$$$$$
下面看一下add event 中的内容,从上面可以看到,如果本地读到了cookie文件,在add event中,会添加cookie
****** Start Log Message ****** Start Frames Hierarchy Tree Dump The Node has no URL End Frames Hierarchy Tree Dump $$$$$$ End Log Message $$$$$$ ****** Add Event For Transaction With Id 5 ****** (Location Flag : tFlagInsertEnd, Location ID : 5) web_url("mail.163.com", "URL=http://mail.163.com/", "TargetFrame=", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t1.inf", "Mode=HTML", LAST); $$$$$$ Add Event For Transaction With Id 5 Ended $$$$$$ ****** Request Header For Transaction With Id 8 ****** GET /favicon.ico HTTP/1.1 Accept: */* Accept-Encoding: gzip, deflate--------------
add event中是空的
但是,录制结束后,生成的脚本中,在访问www.163.com请求之前,仍会出现web_add_cookie,这是为什么?
web_add_cookie("_ntes_nnid=----; DOMAIN=analytics.163.com"); web_add_cookie("_ntes_nnid=----; DOMAIN=iplocator.mail.163.com"); web_add_cookie("starttime=; DOMAIN=iplocator.mail.163.com"); web_add_cookie("logType=; DOMAIN=iplocator.mail.163.com"); web_add_cookie("__ntes__test__cookies=---; DOMAIN=iplocator.mail.163.com"); web_add_cookie("lo=%u5317%u4EAC%u5E02; DOMAIN=iplocator.mail.163.com"); web_add_cookie("lc=; DOMAIN=iplocator.mail.163.com"); web_url("mail.163.com", "URL=http://mail.163.com/", "TargetFrame=", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t1.inf", "Mode=HTML", EXTRARES, "Url=http://mimg.127.net/index/lib/img/bg_httplogin.gif", ENDITEM, "Url=http://mimg.127.net/index/163/img/bg_v5.png", ENDITEM, "Url=http://mimg.127.net/index/163/themes/121112_winter_cnt.jpg", ENDITEM, "Url=http://mimg.127.net/index/163/themes/121106_winter_bg.jpg", ENDITEM, "Url=http://mimg.127.net/p/js5/5.0.0b1211141530/css/base64_compress.css", "Referer=http://mail.163.com/preload5.htm", ENDITEM, "Url=http://mimg.127.net/p/js5/5.0.0b1211141530/js/p0.js", "Referer=http://mail.163.com/preload5.htm", ENDITEM, "Url=http://analytics.163.com/ntes?_nacc=163mail&_nvid=05fb3b295bd3a01d22b676ad800c783d&_nvtm=0&_nvsf=0&_nvfi=1&_nlag=zh-cn&_nlmf=1353037674&_nres=1366x768&_nscd=32-bit&_nstm=0&_nurl=http%3A//mail.163.com/&_ntit=163%u7F51%u6613%u514D%u8D39%u90AE--%u4E2D%u6587%u90AE%u7BB1%u7B2C%u4E00%u54C1%u724C&_nref=&_nfla=10.0&_nssn=&_nxkey=87104210.33190&_end1", ENDITEM, "Url=http://mimg.127.net/p/js5/5.0.0b1211141530/js/p1.js", "Referer=http://mail.163.com/preload5.htm", ENDITEM, "Url=http://iplocator.mail.163.com/iplocator?callback=fSetLocation", ENDITEM, "Url=http://ep.127.net/cte/etest?1353048714328", ENDITEM, "Url=http://tp.127.net/cte/ttest?1353048714296", ENDITEM, "Url=http://ep.127.net/cte/ep?1353048714390", ENDITEM, "Url=http://tp.127.net/cte/tp?1353048714406", ENDITEM, "Url=http://cp.127.net/cte/ctest?1353048714328", ENDITEM, "Url=http://cp.127.net/cte/cp?1353048714468", ENDITEM, LAST);
其中,EXTRARES后面的这些Url是什么?先看看web_url这个函数:
int web_url( const char *StepName, const char *url, <List of Attributes>, [EXTRARES, <List of Resource Attributes>,] LAST );
其中,EXTRARES是个分隔符,他后面的东西是访问这个页面时,要下载的资源(由于web_url默认使用的是HTML Mode的模式,所以你录好的脚本中是否有EXTRARES,在脚本回放的时候,都会默认下载HTML所对应的资源)
上面脚本若选用URL-based录制,那么方位www.mail.com的请求就会变成下面的这个样子
web_url("mail.163.com", "URL=http://mail.163.com/", "Resource=0", "RecContentType=text/html", "Referer=", "Snapshot=t1.inf", "Mode=HTTP", LAST); web_concurrent_start(NULL); web_url("base_v2.js", "URL=http://mimg.127.net/index/lib/scripts/base_v2.js", "Resource=1", "RecContentType=application/x-javascript", "Referer=http://mail.163.com/", "Snapshot=t2.inf", LAST); web_url("163logo.gif", "URL=http://mimg.127.net/logo/163logo.gif", "Resource=1", "RecContentType=image/gif", "Referer=http://mail.163.com/", "Snapshot=t3.inf", LAST); web_url("knet.png", "URL=http://mimg.127.net/logo/knet.png", "Resource=1", "RecContentType=image/png", "Referer=http://mail.163.com/", "Snapshot=t4.inf", LAST); web_url("netease_logo.gif", "URL=http://mimg.127.net/logo/netease_logo.gif", "Resource=1", "RecContentType=image/gif", "Referer=http://mail.163.com/", "Snapshot=t6.inf", LAST); web_url("ntes.js", "URL=http://analytics.163.com/ntes.js", "Resource=1", "RecContentType=application/x-javascript", "Referer=http://mail.163.com/", "Snapshot=t8.inf", LAST); web_url("preload5.htm", "URL=http://mail.163.com/preload5.htm", "Resource=0", "RecContentType=text/html", "Referer=http://mail.163.com/", "Snapshot=t11.inf", "Mode=HTTP", LAST); web_concurrent_end(NULL); web_url("bg_v5.png", "URL=http://mimg.127.net/index/163/img/bg_v5.png", "Resource=1", "RecContentType=image/png", "Referer=http://mail.163.com/", "Snapshot=t5.inf", LAST); web_url("bg_httplogin.gif", "URL=http://mimg.127.net/index/lib/img/bg_httplogin.gif", "Resource=1", "RecContentType=image/gif", "Referer=http://mail.163.com/", "Snapshot=t7.inf", LAST); web_concurrent_start(NULL); web_url("121116_dt_cnt2.jpg", "URL=http://mimg.127.net/index/163/themes/121116_dt_cnt2.jpg", "Resource=1", "RecContentType=image/jpeg", "Referer=http://mail.163.com/", "Snapshot=t9.inf", LAST); web_url("121116_dt_bg2.jpg", "URL=http://mimg.127.net/index/163/themes/121116_dt_bg2.jpg", "Resource=1", "RecContentType=image/jpeg", "Referer=http://mail.163.com/", "Snapshot=t10.inf", LAST); web_concurrent_end(NULL);
这种录制的方法,将对每个资源的下载,放在单独的web_url()中去提交,(这里说一下web_concurrent_start与web_concurrent_end之间的web_url是并行提交的,他的提交顺序,并不是你再脚本中看到的由上至下顺序提交的)
说这些是为了说明为什么在没有cookie的时候,录制的时候会在访问mail.163.com前面出现add_web_cookie()?看下上面代码的generation log就知道了
****** Add Event For Transaction With Id 27 ****** (Location Flag : tFlagInsertAfter, Location ID : 22) web_url("preload5.htm", "URL=http://mail.163.com/preload5.htm", "Resource=0", "RecContentType=text/html", "Referer=http://mail.163.com/", "Snapshot=t9.inf", "Mode=HTTP", LAST); $$$$$$ Add Event For Transaction With Id 27 Ended $$$$$$ ****** Add Event For Transaction With Id 0 ****** (Location Flag : tFlagInsertBefore, Location ID : 1000005) web_add_cookie("starttime=; DOMAIN=mail.163.com"); $$$$$$ Add Event For Transaction With Id 0 Ended $$$$$$ ****** Add Event For Transaction With Id 0 ****** (Location Flag : tFlagInsertBefore, Location ID : 1000005) web_add_cookie("logType=; DOMAIN=mail.163.com"); $$$$$$ Add Event For Transaction With Id 0 Ended$$$$$$
从上面的日志中看到,因为在某些请求资源的web_url()中添加了cookie。这些请求的web_url()的顺序是并发,多以看到这些添加cookie的位置也不同
3--lr脚本回放时,是在本地读取cookie 还是直接使用脚本中的cookie?--
现在新的问题出现了,好多人在录制脚本时,会遇到这样的问题:当有些时候把脚本中的cookie删掉,在回放脚本的时候会出现错误。
既然在访问网站的时候,网站会将cookie保存在用户本地,那么在lr提交请求的时候,lr会在本地读取cookie文件,与脚本中有没有cookie有什么关系???
(前提,将本地的cookie文件全部删除)做个实验,在录制好登陆mail.163.com,(录制脚本结束后,本地就会有新的cookie文件生成,163登陆的脚本中只需要关联id就可以登陆成功)并可以回放成功。然后将cookie文件再全部删除,在回放脚本,脚本可以回放成功。
因为这个脚本中的cookie与能否成功没有直接的关系(只是些资源,有效期之类的),脚本回放时,每次都向163网站提供用户名及密码,所以脚本中没有这些cookie也可以登录成功。
(前提:本地没有cookie文件,登录邮箱,并设置163邮箱的自动登录选项,登录后退出,这是本地已经有了cookie文件)再做个试验,在地址栏中直接输入:mail.163.com,这种情况下是可以自动登录成功的。然后录制自动登录的脚本,修改脚本(同样,只需要关联session id),回放脚本,这用情况下也是可以登陆成功。将脚本中的cookie全部注释掉,回放脚本,是否能登陆成功?删掉本地cookie文件。重新在地址栏中输入mail.163.com,这时登陆邮箱失败。取消对lr中队cookie的注释,回放脚本,这是登陆是否成功?
先来看一下自动登录脚本中的cookie是什么样子的
web_add_cookie("starttime=; DOMAIN=count.mail.163.com"); web_add_cookie("mail_style=js5; DOMAIN=count.mail.163.com"); web_add_cookie("mail_uid=yuxiaocao_07@163.com; DOMAIN=count.mail.163.com"); web_add_cookie("mail_popup=a24; DOMAIN=count.mail.163.com"); web_add_cookie("_ntes_nnid=------------,--------; DOMAIN=count.mail.163.com"); web_add_cookie("_ntes_nuid=-------------; DOMAIN=count.mail.163.com"); web_add_cookie("NTES_PASSPORT=--------; DOMAIN=count.mail.163.com"); web_add_cookie("P_INFO=--------; DOMAIN=count.mail.163.com"); web_add_cookie("USERTRACK=-----; DOMAIN=count.mail.163.com"); web_add_cookie("mail_host=-----; DOMAIN=count.mail.163.com");
这个cookie与提交用户和用户名登陆的脚本中有些不一样的地方:
web_add_cookie("NTES_PASSPORT=--------; DOMAIN=count.mail.163.com");------这个就是你能否直接成功登陆的cookie
若将这个cookie注释掉,即使,本地有cookie文件,脚本回放也是失败的(只要有本地有cookie文件,就可以在IE中直接登录邮箱)。将本地的cookie文件删除,这时在IE肯定是无法登陆邮箱。那回放脚本呢?取消脚本中对cookie的注释,再次回放,成功登陆。
通过以上实验,可以发现在回放lr的脚本时,脚本是不读本地文件的,因为他已经将本地的cookie在生成脚本的时候添加到脚本中了,所以有些时候删掉cookie可以成功回放,但是删掉与以后操作步骤有关联的cookie,回放就会失败。
总结如下:
1:访问一个网站时,浏览器(IE)将访问请求与本地的cookie(cookie存放在http请求的消息头中)一起发送到该网站的服务器
2:lr在生成脚本时,会将录到的http请求消息头中的cookie添加到脚本中,即add_web_cookie()
3:网站通过http响应消息头中的Set-Cookie将cookie保存在用户本地
4:lr在脚本回放时,不再读取本地cookie文件,而是使用脚本中的cookie,即,脚本中的add_web_cookie(),lr回放时也不会生成新的cookie文件(因为cookie文件的生成时针对浏览器的,所以lr回放时只是模拟浏览器的发包,所以他不会去读或者写cookie文件,他的add_web_cookie()只是模拟浏览器的cookie行为)
5:mail.163.com在提交登陆请求时,使用的是明文的密码,用wireshark抓下包,点击登陆请求那个包里面的连接,就可以直接登陆了。嘿嘿!!!