loadrunner使用system()函數調用Tesseract-OCR識別驗證碼遇到的問題


俗話說前人栽樹,后人乘涼,此話一點不假,結合雲層的一遍文章: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識別的精確度是勢在必行的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM