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抓下包,点击登陆请求那个包里面的连接,就可以直接登陆了。嘿嘿!!!

 

 

 

 

 

     

    

posted on 2012-11-19 15:19  龙沙宝石  阅读(6250)  评论(0编辑  收藏  举报

导航