【java+selenium3】Tesseract-OCR識別圖片驗證碼 (十六)

【java+selenium+Tesseract-OCR(圖片識別)+AutoIt(windows窗口識別)】完成自動化圖片驗證碼識別!html

1、AutoIt(windows窗口識別)參考:http://www.javashuo.com/article/p-qeugdedb-bd.htmljava

2、Tesseract-OCR(圖片識別)git

1. 官網下載 tesseract:http://sourceforge.net/projects/tesseract-ocr/github

   歷史版本下載:https://digi.bib.uni-mannheim.de/tesseract/web

2.安裝tesseract,安裝成功須要配置環境變量apache

PATH:安裝目錄(C:\Program Files (x86)\Tesseract-OCR)windows

TESSDATA_PREFIX:C:\Program Files (x86)\Tesseract-OCR\tessdataapp

3.語言庫地址爲:https://github.com/tesseract-ocr/tessdata工具

   將所須要的語言庫下載下來,放在F:\Program Files (x86)\Tesseract-OCR\tessdata目錄下spa

4.將tesseract.exe命令保存爲bat文件,bat內容爲

@echo off
tesseract.exe D:\yzm\yan.png D:\yzm\result -l
exit

或者

@echo off
tesseract.exe D:\yzm\yan.png D:\yzm\result -psm 6
exit
//註解:
//圖片路徑D:\yzm\yan.png 生成txt文件存放路徑及文件名result
tesseract.exe D:\yzm\yan.png D:\yzm\result -l
tesseract.exe D:\yzm\yan.png D:\yzm\result -psm 6

5.java調用該bat文件

public static void main(String[] args) {
     String cmd = "cmd /k start D:/yzm/tesseract.bat";
      try {
        Runtime.getRuntime().exec(cmd);
    } catch (Exception e) {
        e.printStackTrace();
    } 
}
//知識擴展
cmd命令執行窗口開閉指令

cmd /c dir 是執行完dir命令後關閉命令窗口。

cmd /k dir 是執行完dir命令後不關閉命令窗口。

cmd /c start dir 會打開一個新窗口後執行dir指令,原窗口會關閉。

cmd /k start dir 會打開一個新窗口後執行dir指令,原窗口不會關閉。

運行成功後,會生成一個result.txt文件,該文件保存了驗證碼的文本內容
6.java代碼執行tesseract.bat文件後讀取txt文件返回驗證碼字符串代碼實現,TXT讀寫詳細參考:https://www.cnblogs.com/xiaozhaoboke/p/11177168.html

package cn.xiaobing.util;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;

public class ReadYZM {
    /**
     * 使用Tesseract-OCR識別圖片驗證碼
     */
    public static String read_yzm() {
        String cmd = "cmd /c start D:/yzm/tesseract.bat";
          try {
            Runtime.getRuntime().exec(cmd);
        } catch (Exception e) {
            e.printStackTrace();
        }
        try {
            //線程阻塞3秒等待tesseract.bat執行完成
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        //執行tesseract.bat識別圖片後生成result.txt文件中保存識別後驗證碼
        //讀取result.txt文件獲取驗證碼
//          ReadTxt
        String yzmTxt = readTxt("D:/yzm/result.txt");
        return yzmTxt;
    }
/**傳入txt路徑讀取txt文件
 * @param txtPath
 * @return 返回讀取到的內容
 */
public static String readTxt(String txtPath) {
    File file = new File(txtPath);
    if(file.isFile() && file.exists()){
        try {
            FileInputStream fileInputStream = new FileInputStream(file);
            InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
             
            StringBuffer sb = new StringBuffer();
            String text = null;
            while((text = bufferedReader.readLine()) != null){
                sb.append(text);
            }
            return sb.toString();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    return null;
    }
}

7.web自動化實戰演示

package cn.xiaobing.cases;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.testng.annotations.Test;

import cn.xiaobing.util.CreateElementScreenshot;
import cn.xiaobing.util.ReadYZM;

public class TestCase01 extends BaseCase {
    @Test
    public void test() throws InterruptedException {
        driver.get("http://sh.ipyy.com:8888/logins.html");
        WebElement element = driver.findElement(By.id("yzmimg"));
        File img = CreateElementScreenshot.captureElement(element);
        try {
            //調用FileUtils工具類,複製img圖片,new File保存至新的路徑下
            FileUtils.copyFile(img, new File("D:/yzm/yzm.png"));
            Thread.sleep(3000);
            //使用Tesseract-OCR識別圖片驗證碼
            String str = ReadYZM.read_yzm();
            driver.findElement(By.id("code")).sendKeys(str);
            Thread.sleep(3000);
        } catch (IOException e) {
            e.printStackTrace();
        } 
    }
}

代碼執行驗證碼自動輸入展現:

8.總結:使用Tesseract-OCR識別圖片驗證碼成功率過低,正在尋找更好的方法!

相關文章
相關標籤/搜索