俗話說前人栽樹,后人乘涼,此話一點不假,結合雲層的一遍文章:http://bbs.51testing.com/thread-533920-1-1.html,知道還有一個Tesseract-OCR可以用來識別圖片上的文字(驗證碼)。
在code.google上下載了tesseract-ocr-setup-3.02.02.exe,即windows版本,下載安裝后安裝路徑自動加入到環境變量中,在cmd中可以手動測試一下:
格式如下:tesseract.exe c:\test1.jpg c:\test -l
//test1.jpg 是我提前保存在C盤中的驗證碼圖片,后面的test自動把test1.jpg中的驗證碼保存到test.txt中,后面-l是寫入到test.txt文件中的。
按照雲層提供的腳本,在system("c:\test.bat");無法運行,批處理腳本一閃就沒有啦。修改了system("c:\\test.bat");,並修改了批處理文件,加入了pause,提示錯誤。如下圖:
loadrunner工具不識別tesseract.exe命令,但是手動在任何目錄中都是可以的,難道通過LR打開的終端窗口對windows中的path環境變量不識別??這個稍后嚴重。。
看樣子只能修改這個批處理文件啦,把路徑指定到tesseract的安裝目錄中去才可以。
然后運行成功,在自動生成的test.txt中可以看到獲取的驗證碼,也可以再LR的輸出中看到驗證碼:t4zbyh
試了幾個驗證碼,大多沒有問題,
其中下面的不能被識別(2013年3月8日補充:並不是所有HTTPS的不能被識別,中信銀行信用卡中心的驗證碼(純數字的)就可以被識別https://creditcard.ecitic.com/citiccard/cppnew/jsp/valicode.jsp?time=1362724476515,一些驗證碼不被識別的原因還待摸索,為什么https純數字的驗證碼就可以,難道其他的驗證碼是英文字符或者是加粗或者是圖片太大的原因嗎??):前面帶有HTTPS的,
https://passport.csdn.net/ajax/verifyhandler.ashx?r_d=63178
下面是loadrunner腳本:現在C盤中建立test.bat批處理
Action() { int flen; //定義一個整型變量保存獲得文件的大小 long filedes; //保存文件句柄 char file[256]="c:\\test1.jpg"; //保存文件路徑及文件名 char result[10]; //存放驗證碼的 web_set_max_html_param_len("2000000");//設置頁面接收最大的字節數,該設置應大於下載文件的大小 web_reg_save_param("pic", "LB=", "RB=", "Ord=1", "Search=Body", LAST); web_url("randpiccloud","URL=https://passport.csdn.net/ajax/verifyhandler.ashx?r_d=63178",LAST); //http://biz.ftuan.com/CheckImg.aspx //http://passport.ftuan.com/SecurityCode.aspx?refresh=Wed Mar 6 11:21:21 UTC+0800 2013 //http://comment8.mydrivers.com/radompage.aspx?0.{rnum} //https://passport.gaopeng.com/captcha?w=98&h=36&r=0.4655476964544505 //https://passport.csdn.net/ajax/verifyhandler.ashx?r_d=63178 flen = web_get_int_property(HTTP_INFO_DOWNLOAD_SIZE); //獲得文件大小 if(flen > 0) { if((filedes = fopen(file, "wb")) == NULL) { lr_output_message("oh cloud your Open File Failed!"); return -1; } fwrite( lr_eval_string("{pic}"),flen,1,filedes ); fclose( filedes ); } system("c:\\test.bat"); //調用C盤下的test.bat文件,改文件內容如下: /* c: cd C:\Program Files\Tesseract-OCR tesseract.exe c:\test1.jpg c:\test -l */ //首先下載Tesseract工具並安裝,在批處理文件中必須cd到安裝目錄,否則LR調用時會提示“tesseract.exe不是內部命令” if((filedes = fopen("c:\\test.txt", "rt")) == NULL) { lr_output_message("oh,cloud your Open File Failed!"); return -1; } fread( result,5,1,filedes); //此處控制驗證碼的長度 fclose( filedes ); lr_output_message("result: %s",result);
lr_save_string(result,"txtCheck"); //傳驗證碼到txtCheck參數
lr_output_message("txtCheck: %s",lr_eval_string("{txtCheck}")); //lr_eval_string("{txtCheck}")用在下面的登錄中
return 0; }
后續關注的問題是Tesseract-OCR識別圖片的精確度,排除https協議的影響,目前識別驗證碼的精確度為70%左右,如果用在性能測試項目或者自動化測試項目中,將會大大降低工作效率的,並且system()調用批處理以及處理批處理也需要消耗時間。在正式測試時,盡量不要使用該工具,最好的辦法是讓研發開一個萬能驗證碼或者去掉驗證碼功能。
好了,明天再研究吧。
近現代社會對電商網絡的依賴程度越來越高,說不好有某些變態的測試需求,有可能在線上進行自動化測試,公司又有強硬的安全機制束縛,使用Tesseract-OCR來識別登錄驗證碼或者注冊驗證碼,支付時驗證碼等,還是有很大用處的。提高Tesseract-OCR識別的精確度是勢在必行的。