


软件测试培训
达内IT学院
400-996-5531
在日常生活中我们经常面对要输入验证码的时候,比如刷卡的时候、注册登录的时候等,但是在我们进行软件测试之自动化测试的时候碰到验证码,要如何去进行识别与处理呢?今天我们的软件测试培训就带来相关的知识分享,大家一起来看一下吧:
在做自动化测试的时候,经常会遇到需要输入验证码的地方,有些可以让开发屏蔽,但是有些不行,这时候,我们可以调用tesseract来实现图像的识别。
在JAVA中调用tesseract,主要有两种方式:cmd方式,tess4j方式。我要介绍的是用tess4j的方式来识别图像,得到验证码。
首先要在工程中加入tess4j的jar包,如果是maven项目,可以从中央仓库中获取#/ 直接搜索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容易出现错读的情况,如果你有更好的办法提高正确率,欢迎来达内软件测试培训机构,我们一起交流!
恭喜你阅读完了本文,相信以后再面对面试官问你:验证码的识别与处理的相关问题,你都可以对答如流了,另外你也可以轻松应对你在软件测试工作中出现的验证码的相关问题了,如果你还有更多软件测试相关的问题,欢迎你来达内软件测试培训机构进行咨询。
免责声明:内容和图片源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。
填写下面表单即可预约申请免费试听! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!
Copyright © 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有