月薪20K软件测试自动化岗必问面试题:验证码识别与处理
本文乃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软件测试自动化岗必问面试题:验证码识别与处理的更多相关文章
- 这几种实现线程的方法你一定要知道,月薪20k以上的面试都会问到
实现线程的三种方式总结 最近有看到Java线程的实现相关问题,在此对线程实现方式做一个小小的总结,当做笔记,便于日后查看. 平时常用的线程方式有三种: (1).继承Thread类,并重写其run()方 ...
- 月薪20k+的Android面试都问些什么?(含答案)
金九银十跳槽季接近尾声了,可是今年由于疫情的影响仍然不太好找工作,相信大家肯定急需一套Android面试宝典,下面就分享给大家我珍藏已久的Android高阶面试宝典,供大家学习 ! 1.自定义Hand ...
- 耐心看,1个Dubbo漏洞,35道必问面试题,Dubbo没什么可神秘的
Dubbo漏洞 无意中在网上看到了这样的一条新闻,说是我们360监测发现了Dubbo官方发布的危险漏洞通告,而且尴尬的是,世界上受影响最大的居然是中国,有图有真相 我感觉这也从侧面证明了一件事情,就是 ...
- 【金九银十必问面试题】站在架构师角度分析问题,如何解决TCC中的悬挂问题
"如何解决TCC中的悬挂问题"! 一个工作了4年的Java程序员,去京东面试,被问到这个问题. 大家好,我是Mic,一个工作了14年的Java程序员 这个问题面试官想考察什么方面的 ...
- 阿里Jvm必问面试题及答案
什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程.Java源文件被编译成能被Java虚拟机执行的字节码文件. Java被设计 ...
- 「2022」打算跳槽涨薪,必问面试题及答案 -- ECMAScript 篇
起点低怕什么,大不了加倍努力.人生就像一场马拉松比赛,拼的不是起点,而是坚持的耐力和成长的速度.只要努力不止,进步也会不止. 1.ECMAScript 与 JavaScript 的关系? ECMA(E ...
- 【20K必备知识点】北上广Java开发月薪20K往上,该如何做,需要会写什么
有人回答说这只能是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿两万的不太可能是码农了,应该已经转管理.还有区域问题,这个不在我的考虑范围内,因为除了北上广深杭,其他地方也很难 ...
- 北上广Java开发月薪20K往上,该如何做,需要会写什么
这个问题可能很多人会说这只是大企业或者互联网企业工程师才能拿到.也许是的,小公司或者非互联网企业拿两万的不太可能是码农了,应该已经转管理.还有区域问题,这个不在我的考虑范围内,因为这方面除了北上广深杭 ...
- 《软件测试自动化之道》读书笔记 之 底层的Web UI 测试
<软件测试自动化之道>读书笔记 之 底层的Web UI 测试 2014-09-28 测试自动化程序的任务待测程序测试程序 启动IE并连接到这个实例 如何判断待测web程序完全加载到浏览 ...
随机推荐
- 数据库——SQL数据连接查询
连接查询 查询结果或条件涉及多个表的查询称为连接查询SQL中连接查询的主要类型 广义笛卡尔积 等值连接(含自然连接) 自身连接查询 外连接查询 一.广义笛卡尔积 不带连 ...
- 20181204-2 Final发布
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2476 小组介绍 组长:付佳 组员:张俊余 李文涛 孙赛佳 田良 于洋 段 ...
- ns3 myfirst.cc 两个节点点对点通信
首先在ns3.25/examples/tutorial/下找到 first.cc文件,将他拷贝到到scratch目录下. 然后为了方便将代码打出来 /* -*- Mode:C++; c-file-st ...
- 一本通1641【例 1】矩阵 A×B
1641: [例 1]矩阵 A×B sol:矩阵乘法模板.三个for循环 #include <bits/stdc++.h> using namespace std; typedef lon ...
- 【Java并发编程】之十四:图文讲述同步的另一个重要功能:内存可见性
加锁(synchronized同步)的功能不仅仅局限于互斥行为,同时还存在另外一个重要的方面:内存可见性.我们不仅希望防止某个线程正在使用对象状态而另一个线程在同时修改该状态,而且还希望确保当一个线程 ...
- poj 2528 (线段树+特殊离散化)
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 51098 Accepted: 14788 ...
- MT【166】青蛙跳
(2015浙江重点中学协作体一模) 设ABCDEF为正六边形,一只青蛙开始在顶点A处,它每次可随意地跳到相邻两顶点之一.若在5次之内跳到D点,则停止跳动:若5次之内不能到达D点,则跳完5次也停止跳动. ...
- 洛谷P2633 Count on a tree(主席树,倍增LCA,树上差分)
洛谷题目传送门 题目大意 就是给你一棵树,每个点都有点权,每次任意询问两点间路径上点权第k小的值(强制在线). 思路分析 第k小......又是主席树了.但这次变成树了,无法直接维护前缀和. 又是树上 ...
- Django入门项目实践(中)
4.用户账户 4.1 让用户能够输入数据 添加新主题 # untitled/learning_logs/forms.py from django import forms from .models i ...
- Strassen矩阵乘法之思考
可不可以有另外的划分小矩阵的方法? A*B=C A/B分成n*m个矩阵 可看成一个多元方程. Ci,k = Ai,j * Bjk 每一个Ci,k看成方程的一个未知数 每一个小式子:对于A或B同一列/行 ...