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
是否登录成功;
(方法都是在网上搜的,但是本人经过实验验证成功了)
代码如下:
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
是否登录成功;
相关文章推荐
- SecureCRT解决vi等文件显示中文乱码问题
- Keepalived的相关应用,使用keepalived实现nginx和lvs的高可用负载均衡器
- SELinux/SEAndroid -- 基础知识介绍
- android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明
- c++中const用法总结
- memset函数详解
- python 3读网页文件及保存成本地文件,遇到的编码问题
- java查错题(经常混淆)
- iOS - UI之核心动画CAAnimationGroup以及其他
- mac下liteide gdb 调试
- InstallShield使用——几个技术问题介绍
- 大数阶乘
- c语言操作运算符的优先级,*p++,++*p,++*p++的结果
- C#读取HDF5文件.doc
- 一些可以学习的网站
- PhpStorm设置
- Windows ssh ubuntu / Linux
- 解决dede搜索页面只能显示10条信息解决方案
- Margin是什么?
- (原创)c#学习笔记08--面向对象编程简介02--OOP技术04--对象之间的关系