【java+selenium+Tesseract-OCR(图片识别)+AutoIt(windows窗口识别)】完成自动化图片验证码识别!
一、AutoIt(windows窗口识别)参考:https://www.cnblogs.com/xiaozhaoboke/p/11138548.html
二、Tesseract-OCR(图片识别)
1. 官网下载 tesseract:http://sourceforge.net/projects/tesseract-ocr/
历史版本下载:https://digi.bib.uni-mannheim.de/tesseract/
2.安装tesseract,安装成功需要配置环境变量
PATH:安装目录(C:\Program Files (x86)\Tesseract-OCR)
TESSDATA_PREFIX:C:\Program Files (x86)\Tesseract-OCR\tessdata
3.语言库地址为:https://github.com/tesseract-ocr/tessdata
将所需要的语言库下载下来,放在F:\Program Files (x86)\Tesseract-OCR\tessdata目录下
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识别图片验证码成功率太低,正在寻找更好的方法!