【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識別圖片驗證碼成功率過低,正在尋找更好的方法!