Webdriver配合Tesseract-OCR 自动识别简单的验证码


验证码: 如下,在进行自动化测试,遇到验证码的问题,一般有两种方式

1.找开发去掉验证码或者使用万能验证码

2.使用OCR自动识别



使用OCR自动化识别,一般识别率不是太高,处理一般简单验证码还是没问题

这里使用的是Tesseract-OCR,下载地址:https://github.com/A9T9/Free-Ocr-Windows-Desktop/releases

怎么使用呢?

进入安装后的目录:

tesseract.exe test.png test -1 



准备一份网页,上面使用该验证码

<html>
<head>
<title>Table test by Young</title>
</head>
<body>
 </br>
<h1> Test </h1>
 <img src="//pic.ikafan.com/imgp/L3Byb3h5L2h0dHAvY3N1andjLml0cy5jc3UuZWR1LmNuL3N5cy9WYWxpZGF0ZUNvZGUuYXNweD90PTE=.jpg">
 </br>
</body>
</html>

要识别验证码,首先得取得验证码,这两款采取对 页面元素部分截图的方式,首先获取整个页面的截图

然后找到页面元素坐标进行截取

/**
     * This method for screen shot element
     *
     * @param driver
     * @param element
     * @param path
     * @throws InterruptedException
     */
    public static void screenShotForElement(WebDriver driver,
            WebElement element, String path) throws InterruptedException {
        File scrFile = ((TakesScreenshot) driver)
                .getScreenshotAs(OutputType.FILE);
        try {
            Point p = element.getLocation();
            int width = element.getSize().getWidth();
            int height = element.getSize().getHeight();
            Rectangle rect = new Rectangle(width, height);
            BufferedImage img = ImageIO.read(scrFile);
            BufferedImage dest = img.getSubimage(p.getX(), p.getY(),
                    rect.width, rect.height);
            ImageIO.write(dest, "png", scrFile);
            Thread.sleep(1000);
            FileUtils.copyFile(scrFile, new File(path));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


截取完元素,就可以调用Tesseract-OCR生成text

// use Tesseract to get strings
        Runtime rt = Runtime.getRuntime();
        rt.exec("cmd.exe /C  tesseract.exe D:\\Tesseract-OCR\\test.png  D:\\Tesseract-OCR\\test -1 ");

接下来通过java读取txt

/**
     * This method for read TXT file
     *
     * @param filePath
     */
    public static void readTextFile(String filePath) {
        try {
            String encoding = "GBK";
            File file = new File(filePath);
            if (file.isFile() && file.exists()) { // 判断文件是否存在
                InputStreamReader read = new InputStreamReader(
                        new FileInputStream(file), encoding);// 考虑到编码格式
                BufferedReader bufferedReader = new BufferedReader(read);
                String lineTxt = null;
                while ((lineTxt = bufferedReader.readLine()) != null) {
                    System.out.println(lineTxt);
                }
                read.close();
            } else {
                System.out.println("找不到指定的文件");
            }
        } catch (Exception e) {
            System.out.println("读取文件内容出错");
            e.printStackTrace();
        }
    }


整体代码如下:

  1 package com.dbyl.tests;
  2
  3 import java.awt.Rectangle;
  4 import java.awt.image.BufferedImage;
  5 import java.io.BufferedReader;
  6 import java.io.File;
  7 import java.io.FileInputStream;
  8 import java.io.IOException;
  9 import java.io.InputStreamReader;
 10 import java.io.Reader;
 11 import java.util.concurrent.TimeUnit;
 12
 13 import javax.imageio.ImageIO;
 14
 15 import org.apache.commons.io.FileUtils;
 16 import org.openqa.selenium.By;
 17 import org.openqa.selenium.OutputType;
 18 import org.openqa.selenium.Point;
 19 import org.openqa.selenium.TakesScreenshot;
 20 import org.openqa.selenium.WebDriver;
 21 import org.openqa.selenium.WebElement;
 22
 23 import com.dbyl.libarary.utils.DriverFactory;
 24
 25 public class TesseractTest {
 26
 27     public static void main(String[] args) throws IOException,
 28             InterruptedException {
 29
 30         WebDriver driver = DriverFactory.getChromeDriver();
 31         driver.get("file:///C:/Users/validation.html");
 32         driver.manage().timeouts().pageLoadTimeout(30, TimeUnit.SECONDS);
 33         WebElement element = driver.findElement(By.xpath("//img"));
 34
 35         // take screen shot for element
 36         screenShotForElement(driver, element, "D:\\Tesseract-OCR\\test.png");
 37
 38         driver.quit();
 39
 40         // use Tesseract to get strings
 41         Runtime rt = Runtime.getRuntime();
 42         rt.exec("cmd.exe /C  tesseract.exe D:\\Tesseract-OCR\\test.png  D:\\Tesseract-OCR\\test -1 ");
 43
 44         Thread.sleep(1000);
 45         // Read text
 46         readTextFile("D:\\Tesseract-OCR\\test.txt");
 47     }
 48
 49     /**
 50      * This method for read TXT file
 51      *
 52      * @param filePath
 53      */
 54     public static void readTextFile(String filePath) {
 55         try {
 56             String encoding = "GBK";
 57             File file = new File(filePath);
 58             if (file.isFile() && file.exists()) { // 判断文件是否存在
 59                 InputStreamReader read = new InputStreamReader(
 60                         new FileInputStream(file), encoding);// 考虑到编码格式
 61                 BufferedReader bufferedReader = new BufferedReader(read);
 62                 String lineTxt = null;
 63                 while ((lineTxt = bufferedReader.readLine()) != null) {
 64                     System.out.println(lineTxt);
 65                 }
 66                 read.close();
 67             } else {
 68                 System.out.println("找不到指定的文件");
 69             }
 70         } catch (Exception e) {
 71             System.out.println("读取文件内容出错");
 72             e.printStackTrace();
 73         }
 74     }
 75
 76     /**
 77      * This method for screen shot element
 78      *
 79      * @param driver
 80      * @param element
 81      * @param path
 82      * @throws InterruptedException
 83      */
 84     public static void screenShotForElement(WebDriver driver,
 85             WebElement element, String path) throws InterruptedException {
 86         File scrFile = ((TakesScreenshot) driver)
 87                 .getScreenshotAs(OutputType.FILE);
 88         try {
 89             Point p = element.getLocation();
 90             int width = element.getSize().getWidth();
 91             int height = element.getSize().getHeight();
 92             Rectangle rect = new Rectangle(width, height);
 93             BufferedImage img = ImageIO.read(scrFile);
 94             BufferedImage dest = img.getSubimage(p.getX(), p.getY(),
 95                     rect.width, rect.height);
 96             ImageIO.write(dest, "png", scrFile);
 97             Thread.sleep(1000);
 98             FileUtils.copyFile(scrFile, new File(path));
 99         } catch (IOException e) {
100             e.printStackTrace();
101         }
102     }
103
104 }

时间: 2024-10-10 20:47:18

Webdriver配合Tesseract-OCR 自动识别简单的验证码的相关文章

【验证码】使用Tesseract实现简单的验证码识别

1.Tesseract介绍: Tesseract的OCR引擎最先由HP实验室于 1985年开始研发,至1995年时已经成为OCR业内最准确的三款识别引擎之一.然而,HP不久便决定放弃OCR业务,Tesseract也从此尘封. 数年以后,HP意识到,与其将Tesseract束之高阁,不如贡献给开源软件业,让其重焕新生--2005年,Tesseract由美国内华达州信息技 术研究所获得,并求诸于Google对Tesseract进行改进.消除Bug.优化工作. 2.下载 Tesseract: http

Python验证码识别--利用pytesser识别简单图形验证码

一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域…… 简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行图形的计算.处理和显示的相关原理与算法.图形通常由点.线.面.体等几何元素和灰度.色彩.线型.线宽等非几何属性组成.计算机涉及到的几何图形处理一般有 2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正.对于颜色则有色彩空间的计算与转换,图形上色,阴影,色差处理等等. 在破解验证码中需要用

python 简单图像识别--验证码

python  简单图像识别--验证码 记录下,准备工作安装过程很是麻烦. 首先库:pytesseract,image,tesseract,PIL windows安装PIL,直接exe进行安装更方便(https://files.cnblogs.com/files/Oran9e/PILwin64.zip)(https://files.cnblogs.com/files/Oran9e/PILwin32.zip) 安装 image:pip install image 安装 pytesseract:pi

Python验证码识别:利用pytesser识别简单图形验证码

一.探讨 识别图形验证码可以说是做爬虫的必修课,涉及到计算机图形学,机器学习,机器视觉,人工智能等等高深领域--    简单地说,计算机图形学的主要研究内容就是研究如何在计算机中表示图形.以及利用计算机进行图形的计算.处理和显示的相关原理与算法.图形通常由点.线.面.体等几何元素和灰度.色彩.线型.线宽等非几何属性组成.计算机涉及到的几何图形处理一般有 2维到n维图形处理,边界区分,面积计算,体积计算,扭曲变形校正.对于颜色则有色彩空间的计算与转换,图形上色,阴影,色差处理等等. 在破解验证码中

Python下Tesseract Ocr引擎及安装介绍

1.Tesseract介绍 tesseract 是一个google支持的开源ocr项目,其项目地址:https://github.com/tesseract-ocr/tesseract,目前最新的源码可以在这里下载. 实际使用tesseract ocr也有两种方式:1- 动态库方式 libtesseract  2  - 执行程序方式 tesseract.exe 由于本人也是python菜鸟一个,所以方式1暂时不会,只好采取方式2. 2.Tesseract安装包下载 Tesseract的relea

[转]tesseract OCR Engine overview字符识别学习

原文地址:http://blog.csdn.net/viewcode/article/details/7790065 正文: 原文: An Overview of the Tesseract OCR Engine 下载地址http://code.google.com/p/tesseract-ocr/wiki/Documentation Tesseract的识别步骤大致如下: 1. 连通区域分析: 2. 检测出字符区域区域(轮廓外形),以及子轮廓: 3. 由字符轮廓,得出文本行,以及通过空格识别出

如何在windows上编译Tesseract OCR

获取Tesseract源码的方式有很多.可以直接从repo获取,也可以下载压缩包.不过编译的时候往往也会出现各种奇怪的问题.这里介绍如何简单的配置和编译源码. 参考原文:How to Build Tesseract OCR Library on Windows 编译Tesseract 下载 Windows installer of tesseract-ocr 3.02.02 安装 安装过程中勾选Tesseract development files: 编译 在安装目录中找到vs2008到工程目录

财务报表OCR自动识别方案,发票识别,票据OCR识别,OCR发票识别

财务报表有什么作用 财务报表又叫会计报表,包含:资产负债表.损益表.现金流量表三表.财务报表对企业经营状况有重要的参考意义: 全面系统地揭示企业一定时期的财务状况.经营成果和现金流量: 有利于投资者.债权人和其他有关各方掌握企业的财务状况.经营成果和现金流量情况,进而分析企业的盈利能力.偿债能力.投资收益.发展前景等,为他们投资.贷款和贸易提供决策依据: 满足财政.税务.工商.审计等部门监督企业经营管理. 二.财务报表数据采集的困难 当前,财务报表的数据分析基本上还是基于人工阅读审核的方式,效率

简单制作验证码和绘制图片

今天仍然是完善一般处理程序小项目,但是昨天小小的项目已经终结,今天只是完善一下新的样式罢啦,嘿嘿,我们通常在网上浏览图片时间都会看到图片上面呈现有水印字体的样式,其实这些图片都是通过一些简单的小技术来修饰的:另外我们现在在网上随处可见注册页面,当我们想在一个网站上面注册新的用户时间,需要注册完信息以后填写随机生成的验证码,或者我们想要登录一个网站时间也需要验证码的填写,由此可见,验证码也是我们程序员需要必备的小技术哦,下面就来总结一下这两项小功能的实现. 一.图片上的水印字体 我们可以看到第一张