您的位置:首页 > 其它

LoadRunner获取登录验证码

2015-11-03 11:04 288 查看
      原理很简单,用一个请求去刷新认证码返回页面,然后通过关联将返回的图片保存为硬盘的一个文件,然后用ocr去识别这个文件内容,保存结果到txt,最后用LR读这个文本就可以得到认证码
(方法都是在网上搜的,但是本人经过实验验证成功了)

代码如下:
Action()
{  int flen;    //定义一个整型变量保存获得文件的大小
  long filedes;    //保存文件句柄

      char file[256]="D:\\test1.png";    //保存文件路径及文件名

      char result[5];   //存放验证码的,必须大于验证码的位数

     web_set_max_html_param_len("20000");     //设置参数的最大长度,注意该值必须大于文件的大小
   
web_url("login", 
"URL=http://X.X.X.X/Kindergarten/login/login", 
"Resource=0", 
"RecContentType=text/html", 
"Referer=", 
"Snapshot=t1.inf", 
"Mode=HTTP", 
LAST);  

//使用关联函数获取下载文件的内容,在这里不定义左右边界,获得服务器响应的所有内容
web_reg_save_param("pic",
    "LB=",
    "RB=",

      "SEARCH=BODY",

        LAST);

    //发送下载验证码的请求
web_url("voliCode", 
"URL=http://X.X.X.X/Kindergarten/login/voliCode?d=1446432884699", 
"Resource=0", 
"RecContentType=text/html", 
"Referer=", 
"Snapshot=t1.inf", 
"Mode=HTTP", 
LAST); 

 flen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE);   //获取响应中的文件长度

      if(flen > 0) 
      {
        //以写方式打开文件
             if((filedes = fopen(file, "wb")) == NULL)

             {

                    lr_output_message("打开文件失败!");
               return -1;

               }

  fwrite(lr_eval_string("{pic}"), flen, 1, filedes);   //写入文件内容
  fclose(filedes);    //关闭文件

    }

system("D:\\test.bat");

   if((filedes=fopen("D:\\test.txt","rt"))== NULL)

     {

          lr_output_message("打开test.txt文件失败!");
     return -1;

     }  

    
fread(result,4,1,filedes);
fclose(filedes);  

lr_output_message("the velue3 is: %s",result); 

lr_save_string(result,"check");

lr_output_message("the check is %s",lr_eval_string("{check}"));

lr_start_transaction("登录");
web_submit_data("userLogin", 
"Action=http://X.X.X.X/Kindergarten/login/userLogin", 
"Method=POST", 
"RecContentType=text/html", 
"Referer=http://X.X.X.X/Kindergarten/login/login", 
"Snapshot=t13.inf", 
"Mode=HTTP", 
ITEMDATA, 
"Name=username", "Value=17715290001", ENDITEM, 
"Name=password", "Value=123456", ENDITEM, 
"Name=code", "Value={check}", ENDITEM, 
LAST); 
lr_end_transaction("登录",LR_AUTO);

    //验证登录是否成功:登录进去后再提交一次数据交互的请求
lr_start_transaction("修改密码");

     web_submit_data("changePwd", 
"Action=http://X.X.X.X/Kindergarten/sys/changePwd", 
"Method=POST", 
"RecContentType=application/json", 
"Referer=http://X.X.X.X/Kindergarten/sys/changePwdView", 
"Snapshot=t53.inf", 
"Mode=HTTP", 
ITEMDATA, 
"Name=oPwd", "Value=123456", ENDITEM, 
"Name=nPwd", "Value=qwaszx", ENDITEM, 
"Name=nPwd2", "Value=qwaszx", ENDITEM, 
LAST);

  lr_end_transaction("修改密码",LR_AUTO);

return 0;

}

备注:
1、char result[5];这个是定义存放验证码的,必须大于验证码的位数,否则最后文件读出来的验证码后面会自动加入几个乱码字符;
2、 system("D:\\test.bat");  执行test.bat,注意D盘和test.bat之间是\\,盘符要转义;  test.bat内容如下:
    D:\InstallSoftware\Tesseract-OCR\tesseract.exe d:\test1.png d:\test -1   (tesseract.exe必须安装目录也写进去)
3、我测试的系统登录的url是 http://X.X.X.X/Kindergarten/login/login, 如果直接获取该网址的文件来获取验证码,文件太大,会失败;可以用火狐浏览器打开该网址,然后选中验证码,右键直接查看获取验证码的url,即:http://X.X.X.X/Kindergarten/login/voliCode?d=1446432884699;
然后再使用关联函数 web_reg_save_param获取 该url的下载内容;
4、回放的时候可以展示场景操作的页面,在 General Options--Display 里面设置,但是因为可能有缓存情况,所以不能根据登录成功后的系统页面来判断是否登录成功,最好是再操作一个数据交互的请求来判断是否登录成功;我的例子是再提交一个修改密码的操作来操作
901d
是否登录成功;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: