原理很简单,用一个请求去刷新认证码返回页面,然后通过关联将返回的图片保存为硬盘的一个文件,然后用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 里面设置,但是因为可能有缓存情况,所以不能根据登录成功后的系统页面来判断是否登录成功,最好是再操作一个数据交互的请求来判断是否登录成功;我的例子是再提交一个修改密码的操作来操作是否登录成功;