本文乃Happy老师的得意门生来自java全栈自动化测试4期的小核桃所作。正所谓严师出高徒,笔下有黄金~~让我们一起来征服面试官吧~~


在做自动化测试的时候,经常会遇到需要输入验证码的地方,有些可以让开发屏蔽,但是有些不行,这时候,我们可以调用tesseract来实现图像的识别。

在JAVA中调用tesseract,主要有两种方式:cmd方式,tess4j方式。我要介绍的是用tess4j的方式来识别图像,得到验证码。

首先要在工程中加入tess4j的jar包,如果是maven

项目,可以从中央仓库中获取https://mvnrepository.com/ 直接搜索tess4j

点击打开

选择使用比较多的,点进去

复制这段代码粘贴到maven工程的pom.xml里面

等待下载完成

安装完成之后,在Maven Dependencies库中会出现tess4j的jar包,官方解释tess4j:A Java JNA wrapper for Tesseract OCR API.

也就是说:tess4j是针对tesseract进行封装的javaAPI。安装好依赖库之后,就不需要另外再安装tessereact-ocr了,因为tess4j的jar包里面自带了tessereact-ocr。

安装好之后,如果没有把文字库tessdata放到项目中,调用的时候会报错,如下

Error opening data file ./tessdata/eng.traineddata
Please make sure the TESSDATA_PREFIX environment variable is set to the parent directory of your "tessdata" directory.
Failed loading language 'eng'
Tesseract couldn't load any languages!

Could not initialize tesseract.

这里提示的是环境变量没有设置,这是针对安装tessreact-ocr的调用的错误提示,所以按照这个去加环境变量,问题还是会出现的(这里我折腾了好久才解决)。

针对依赖库的方法调用,解决这个问题的正确做法是在maven项目的resources路径下添加tessdata文字库

eng.traineddata是英文语言包,识别字母和数字。

如果想要识别中文(数字 + 中文),需要在下载chi_sim.traineddata语言包。这样tess4j就能正常使用了。

接下来是调用过程,要是别验证码,主要的步骤是得到验证码图片,进行识别,输出识别结果。

得到验证码图片分为三步:

1、 将验证码页面截图保存

 

public byte[] takeScreenshot(WebDriver driver) throws IOException {
byte[] screenshot = null;
screenshot = ((TakesScreenshot) driver)
.getScreenshotAs(OutputType.BYTES);//得到截图
return screenshot;
}

2、得到的图片是整个屏幕的截图,我们可以处理一下,对图片进行截取,只保留验证码那一部分

 

public BufferedImage createElementImage(WebDriver driver,
WebElement webElement, int x, int y, int width, int heigth)//开始裁剪的位置和截图的宽和高
throws IOException {
Dimension size = webElement.getSize();
BufferedImage originalImage = ImageIO.read(new ByteArrayInputStream(
takeScreenshot(driver)));
BufferedImage croppedImage = originalImage.getSubimage(x, y,
size.getWidth() + width, size.getHeight() + heigth);//进行裁剪
return croppedImage;

3、tesseract读取图片,获得验证码,默认是英文,如果要使用中文包,加上instance.setLanguage("chi_sim"); 

private String getVerificationCode(String path) {
File imageFile = new File(path);
try {
imageFile.createNewFile();
} catch (IOException e1) {
e1.printStackTrace();
}
WebElement element = driver.findElement(By
.cssSelector("img[id='codeImg']"));
try {
BufferedImage image = createElementImage(driver, element, 687, 362,
54, 18);//得到裁剪的图片
ImageIO.write(image, "png", imageFile);//进行保存
} catch (IOException e) {
e.printStackTrace();
}
ITesseract instance = new Tesseract();//调用Tesseract
URL url = ClassLoader.getSystemResource("tessdata");//获得Tesseract的文字库
String tesspath = url.getPath().substring(1);
instance.setDatapath(tesspath);//进行读取,默认是英文,如果要使用中文包,加上instance.setLanguage("chi_sim"); 
String result = null;
try {
result = instance.doOCR(imageFile);
} catch (TesseractException e1) {

e1.printStackTrace();
}
result = result.replaceAll("[^a-z^A-Z^0-9]", "");//替换大小写及数字
return result;
}

执行结果,得到的图片

得到的验证码

总结:tess4j安装比较方便,只要引入jar就行,不需要额外安装其他软件,tess4j下也封装了图片处理的工具类:如缩放,旋转等(这些我还没用到)。

另外在读取图片的时候,还是比较容易出错的 比如t和l,i和l,e和o容易出现错读的情况,希望有大佬可以完善我的方法,提高正确率。

今天的文章分享就到这里了,感谢小核桃童鞋的分享,其他童鞋有什么想要交流的可以在留言区里面留言噢


月薪20K软件测试自动化岗必问面试题:验证码识别与处理的更多相关文章

  1. 这几种实现线程的方法你一定要知道,月薪20k以上的面试都会问到

    实现线程的三种方式总结 最近有看到Java线程的实现相关问题,在此对线程实现方式做一个小小的总结,当做笔记,便于日后查看. 平时常用的线程方式有三种: (1).继承Thread类,并重写其run()方 ...

  2. 月薪20k+的Android面试都问些什么?(含答案)

    金九银十跳槽季接近尾声了,可是今年由于疫情的影响仍然不太好找工作,相信大家肯定急需一套Android面试宝典,下面就分享给大家我珍藏已久的Android高阶面试宝典,供大家学习 ! 1.自定义Hand ...

  3. 耐心看,1个Dubbo漏洞,35道必问面试题,Dubbo没什么可神秘的

    Dubbo漏洞 无意中在网上看到了这样的一条新闻,说是我们360监测发现了Dubbo官方发布的危险漏洞通告,而且尴尬的是,世界上受影响最大的居然是中国,有图有真相 我感觉这也从侧面证明了一件事情,就是 ...

  4. 【金九银十必问面试题】站在架构师角度分析问题,如何解决TCC中的悬挂问题

    "如何解决TCC中的悬挂问题"! 一个工作了4年的Java程序员,去京东面试,被问到这个问题. 大家好,我是Mic,一个工作了14年的Java程序员 这个问题面试官想考察什么方面的 ...

  5. 阿里Jvm必问面试题及答案

    什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. Java被设计 ...

  6. 「2022」打算跳槽涨薪,必问面试题及答案 -- ECMAScript 篇

    起点低怕什么,大不了加倍努力.人生就像一场马拉松比赛,拼的不是起点,而是坚持的耐力和成长的速度.只要努力不止,进步也会不止. 1.ECMAScript 与 JavaScript 的关系? ECMA(E ...

  7. 【20K必备知识点】北上广Java开发月薪20K往上,该如何做,需要会写什么

    有人回答说这只能是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿两万的不太可能是码农了,应该已经转管理.还有区域问题,这个不在我的考虑范围内,因为除了北上广深杭,其他地方也很难 ...

  8. 北上广Java开发月薪20K往上,该如何做,需要会写什么

    这个问题可能很多人会说这只是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿两万的不太可能是码农了,应该已经转管理.还有区域问题,这个不在我的考虑范围内,因为这方面除了北上广深杭 ...

  9. 《软件测试自动化之道》读书笔记 之 底层的Web UI 测试

    <软件测试自动化之道>读书笔记 之 底层的Web UI 测试 2014-09-28 测试自动化程序的任务待测程序测试程序  启动IE并连接到这个实例  如何判断待测web程序完全加载到浏览 ...

随机推荐

  1. PAT甲题题解-1077. Kuchiguse (20)-找相同后缀

    #include <iostream> #include <cstdio> #include <algorithm> #include <string.h&g ...

  2. CSAPP lab2 二进制拆弹 binary bombs phase_4

    给出对应于7个阶段的7篇博客 phase_1  https://www.cnblogs.com/wkfvawl/p/10632044.htmlphase_2  https://www.cnblogs. ...

  3. LeetCode 504. Base 7 (C++)

    题目: Given an integer, return its base 7 string representation. Example 1: Input: 100 Output: "2 ...

  4. C#Dictionary使用记录

    一.区别 在工作中经常遇到C#数组.ArrayList.List.Dictionary存取数据,其区别和优劣势为: 初始化 数组: int[] buff = new int[6]; ArrayList ...

  5. VS2013的安装与测试

    第一步:下载完成之后点击安装,在安装过程中会出现很多选择,选择社区版(c++),安装完成: 第二步:安装完成之后打开VS2013,如图所示:   第三步:按以下步骤进行 第四步:点击[OK]之后 第五 ...

  6. ElasticSearch 2 (34) - 信息聚合系列之多值排序

    ElasticSearch 2 (34) - 信息聚合系列之多值排序 摘要 多值桶(terms.histogram 和 date_histogram)动态生成很多桶,Elasticsearch 是如何 ...

  7. 第十一周(11.24-12.01)----final评论II

    1.  Nice 项目:约跑软件 这款app非常实用.从性能上讲,这款软件基于Android开发.使用者只要注册就能实用,操作简便.在功能上,这款软件不仅为两个有意愿同时跑步的人牵线,为跑步的人提供跑 ...

  8. Windows10 版本说明 From wiki 20190104

    Windows版本说明 文字版本的: PC版本历史[编辑] 索引:       旧版本       旧版本,受支援       最新版本       最新预览版本 Version 1507(Windo ...

  9. du 显示 前面以及或者两级的目录大小的方法

    mark 一下 du -h --max-depth=

  10. 解决sublime text3下中文无法输入的问题(Ubuntu)

    sublime-text-imfix,非常无脑.就喜欢这样的.