loadrunner学习坑太多2——登录操作回放失败解决方法

1.先记录一下录制时的第一个坑:安装环境导致录制后回放失败,各种报错。
一开始我是直接在自己的笔记本上装的loadrunner,装完后照着学习视频里的操作,试着录了一个登录51cto博客的脚本,结果录制出来的脚本回放时各种报错。清掉所有无关的cookie和URL请求,照着教程里的环境设置重新录制了很多遍,还是报错。无奈只能装了个win7的虚拟机,完全干净的环境,只装一个loadrunner和IE,这下终于能成功回放脚本了。
2.再记录一个小坑:录制百度等网页时,提示安全证书错误,录制失败。
有一天晚上51cto博客登不进去了,大概是服务器问题,然后我就试着录制百度的登录操作。结果发现百度完全没法录,在loadrunner外面用IE登录百度正常,一到录制时就会报网页安全证书有问题,问是否继续访问,勉强录制出来的脚本回放也会失败。还有新浪微博录制时也有同样的问题。
后来在网上查了好久,在某个很隐蔽的角落里,发现有人说,录制百度时如果遇到安全证书的问题,可以在录制选项里,网络-端口映射-捕获级别,修改为WinINet级别数据,这样就可以正常录制了。
3.然后记录一个回放时遇到的大坑:录制登录操作,回放成功,但找不到用户名等登录信息,实际上回放时登录失败。
看着学习视频,我学会了一个神奇的操作叫“检查点”。由于loadrunner自带的运行时查看器有一些兼容性方面的问题,回放时网页上总是无法显示用户名,这样就无法判断回放时到底有没有登录成功。检查点就是在登录后跳转至原博客页面前,添加一个web_reg_find函数,搜索页面上有没有用户名/昵称的文本。
我在自己录制出来的脚本里添加检查点后,发现始终找不到需要的内容,试过用户名、昵称、登录账户(手机号/邮箱)都找不到,这说明回放过程中的登录操作是完全失败的。
然后我开始在网上各种查资料,研究了好几个晚上,试过修改一些录制和回放时的参数、增加一个协议、换一个网站等等各种操作,最终发现可能需要做一个“关联”。对于“关联”这个操作,我是这么理解的:
浏览器第一次访问服务器的时候,服务器在返回数据时会夹带一个暗号,之后浏览器每次与服务器通讯时都要对一下暗号。loadrunner录制时,记录下来服务器给的暗号(记为111)。回放时,loadrunner代替浏览器向服务器请求数据,这时服务器返回的暗号变了(记为222),但是loadrunner仍然用刚才录制时记录下来的111跟服务器来对暗号,服务器不认这个暗号了,自然就拒绝登录了,于是回放时就登录失败。
设置了关联之后,loadrunner在回放时,会找到服务器返回的那个暗号222,用这个暗号来代替录制时记录下来的暗号111来跟服务器通讯,这样就不会出现对不上号的情况了,回放就能成功。
具体操作,我是用的loadrunner提供的自动关联功能。录制完成之后,点击“扫描脚本中关联值”按钮,或Ctrl+F8,可以在关联结果中找到需要关联的数据,选中数据,点击关联,程序会自动创建一个关联,再次回放就能登录成功了,用检查点也可以找到登录信息了(昵称)。
另外还有一点很奇怪,录制时选择录制到action,再扫描关联就扫描不到,但是录制到init,就能扫描出来,不知道为啥,之后学关联的时候再研究。
4.接下来贴一段代码,记录一下目前我从脚本里学到的东西

vuser_init()
{
//进入博客首页
web_url("xqtesting.blog.51cto.com",         
//stepname,vug树形视图中显示的名称,在自动事务处理中也可以用作事务的名称
        "URL=http://xqtesting.blog.51cto.com/", 
        //加载URL地址
        "TargetFrame=",
        //包含当前链接、资源的Frame的名称
        "Resource=0",                           
        //确认该URL是否是资源,0表示该URL不是资源,1表示该URL是资源
        "RecContentType=text/html",
        //录制期间响应报头内容类型,如text/html,application/x-javascript等。它被用来确认目标URL是否是可录制的资源 
        "Referer=",                             
        //要提交该页面请求的URL(如果指向当前页面的页面位置被具体指明,则该属性被省略)
        "Snapshot=t26.inf",
        //快照文件名称,用来关联用的
        "Mode=HTML",                            
        //录制模式,可能的取值有HTML/HTTP
        LAST);  
        //参数列表结束的标志

//web_url,统一资源定位符,用于加载指定的web页面(get请求)
//int web_url( const char *StepName, const char *url, , [EXTRARES, ,] LAST ); 
//ENTRARES:分隔符,表示下列列表是由script、active、Java applet、flash产生的请求

//这是自动插入的关联
//Correlation comment - Do not change!Original value='azBvLkxOTlQCZBt9Kyk3bBp6CWACdyokNFw6SXwhdjNTAwBnf30YJA' Name ='CorrelationParameter_1'

web_reg_save_param_ex(
        "ParamName=CorrelationParameter_1",
        "LB= content=\"",
        "RB===\">\n    ",
        SEARCH_FILTERS,
        "Scope=Body",
        "RequestUrl=*/index*",
        LAST);

//转至登录界面
web_url("index_2",
        "URL=http://home.51cto.com/index?reback=http://xqtesting.blog.51cto.com/",
        "TargetFrame=",
        "Resource=0",
        "RecContentType=text/html",
        "Referer=http://xqtesting.blog.51cto.com/",
        "Snapshot=t28.inf",
        "Mode=HTML",
        LAST);

//登录信息  
web_submit_data("index_4",
        "Action=http://home.51cto.com/index?reback=http://xqtesting.blog.51cto.com/",   
        //执行表单提交的URL地址
        "Method=POST",                                                                  
        //表单提交方法,可取值有get,post
        "TargetFrame=",
        "RecContentType=text/html",
        "Referer=http://home.51cto.com/index?reback=http://xqtesting.blog.51cto.com/",
        "Mode=HTML",
        ITEMDATA,                                                                   
        //属性和数据列表的分割标记,在Java语法中不可使用 
        "Name=_csrf", "Value={CorrelationParameter_1}==", ENDITEM,                      
        //enditem为列表中每个资源的结束标志符
        "Name=LoginForm[username]", "Value=***", ENDITEM,
        "Name=LoginForm[password]", "Value=***", ENDITEM,
        "Name=LoginForm[rememberMe]", "Value=0", ENDITEM,
        "Name=login-button", "Value=登 录", ENDITEM,
        LAST);
//web_submit_data,处理无状态或者上下文无关的表单提交。它用来生成表单的GET或POST请求,这些请求与Form自动生成的请求是一样的,发送这些请求时不需要表单上下文
//函数形式:web_submit_data(const char *StepName,const char *Action,,ITEMDATA,,[EXTRARES,,]LAST);
//数据域列表定义了表单提交的内容。由于此请求是上下文无关的,因此数据域包含了所有的隐含域。使用Form的编码规则组织数据域
//数据域列表可以使用下面任意一种格式:
//"name=n1","value=v1",ENDITEM,
//"name=n2","EncryptedValue=qwerty",ENDITEM

//这是检查点,检查用户名(昵称),因为是reg函数所以要放在URL请求的前面
web_reg_find("Text=***",
        LAST);

//登录成功后跳转到博客首页
web_url("xqtesting.blog.51cto.com_2",
        "URL=http://xqtesting.blog.51cto.com/",
        "TargetFrame=",
        "Resource=0",
        "RecContentType=text/html",
        "Referer=",
        "Snapshot=t32.inf",
        "Mode=HTML",
        LAST);

return 0;
}

你可能感兴趣的:(loadrunner)