在自动化测试过程中我们经常会遇到需要输入验证码的情况,而现在一般以图片验证码居多。通常我们处理这种情况应该用最简单的方式,让开发给个万能验证码或者直接将验证码这个环节跳过。之前在技术交流群里也跟朋友讨论过,有的人认为这不是在解决问题而是在回避问题。对于这种问题只能仁者见仁智者见智了,其实我是很不理解以这种"完美心态"进行自动化测试的童鞋,要将自动化测试深入到测试骨髓,每个步骤每个验证点都要进行自动化测试,不去考虑这个验证点在整个功能逻辑流程中所处的位置、所占的分量,不去考虑自动化测试投入的成本与效果,为了自动化而进行自动化。。。。好了有点扯远了,这篇主要记录的是如何使用ocr图片识别技术来识别验证码。但同时做个提醒,这个技术的效果没有很明显,可以说它只能识别简单的验证码,像平时遇到的那些识别起来是相当费力的。
先介绍下Tesseract-OCR
OCR(Optical Character Recognition):光学字符识别,是指对图片文件中的文字进行分析识别,获取的过程。
Tesseract:开源的OCR识别引擎,初期Tesseract引擎由HP实验室研发,后来贡献给了开源软件业,后经由Google进行改进,消除bug,优化,重新发布。我使用的版本为3.02.02
下载地址:http://download.csdn.net/download/whatday/7740469
一、 安装方法:
1.下载完成后点击安装,按照提醒一步步来即可
2.安装完成,查看安装完成的目录。
3.查看是否安装成功,打开dos,输入tesseract,出现下图的信息则证明安装成功
二、使用方法
1.在D盘根目录下有个验证码图片,我自己用画图写的一个,存为1.jpg
2.进入dos,进入D盘目录下,输入:tesseract 1.jpg result ,tesseract会识别1.jpg并生成一个result.txt文件存入识别结果
----------------------------------------------------------分割线-------------------------------------------------------------
那么如何用代码来进行识别呢?
//ocr识别 public static void ocrIdentificationCode() throws Exception { //调用ocr 生成text Runtime runtime = Runtime.getRuntime(); runtime.exec("cmd.exe /C tesseract.exe D:\1.jpg D:\code -1"); }
//读取目标文件 public static void readCodeText(String filePath) { InputStreamReader isReader = null; String codeStr = null; try { String econding = "GBK"; File file = new File(filePath); if(file.exists()&&file.isFile())//判断文件存在 { isReader = new InputStreamReader(new FileInputStream(file),econding); BufferedReader bfReader = new BufferedReader(isReader); String lineText = null; while((lineText=bfReader.readLine())!= null) { System.out.println(lineText); System.out.println("11111111111111111111"); } }else{ System.out.println("文件不存在"); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); }finally{ try { isReader.close(); } catch (Exception e2) { // TODO: handle exception e2.printStackTrace(); } } }
调用两个方法
---------------------------------------总结-----------------------------------------------------
因为我自己试过使用tesseract-ocr引擎识别测试项目中的验证码,没有识别出来,反正像我们项目中遇到验证码我是找开发要个万能验证码,比较简单粗暴。