【java+selenium3】Tesseract-OCR识别图片验证码 (十六)

【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识别图片验证码成功率太低,正在寻找更好的方法!

 

posted @ 2019-07-12 17:20  o小兵o  阅读(2388)  评论(0编辑  收藏  举报