【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识别图片验证码成功率太低,正在寻找更好的方法!
手机扫一扫
移动阅读更方便
你可能感兴趣的文章