Tesseract-ocr开源ocr引擎结合QTP获取图片验证码

上一篇 / 下一篇  2012-10-29 15:59:47 / 个人分类:QTP自动化笔记

    Tesseract是Ray Smith于1985到1995年间在惠普布里斯托实验室开发的一个OCR引擎,曾经在1995 UNLV精确度测试中名列前茅。但1996年后基本停止了开发。2006年,Google邀请Smith加盟,重启该项目。它能识别一些简单的图片验证码,对于增加了复杂“噪音”验证码识别成功率较低。虽然对复杂验证码识别成功率,但在比较简单的验证码识别时,还是可以非常方便的使用的,在此介绍一下它与qtp结合识别图片验证码的一些简单方法,以下仅仅是方法之一,更多方法有待更深入的探究。
 
本次是以国美网上商城的图片验证码为例子
本次的测试需要:
步骤1:打开国美网上商城首页
步骤2:点击“注册”链接
步骤3:输入验证码
 
验证码获取脚本设计思路:
1.利用qtp的CaptureBitmap将验证码图片保存到本地
2.利用tesseract获取图片中的验证码,并保存到暂存文件
3.利用fso读取文件内容,输入获取的内容验证码输入框
4.利用批处理删除图片及验证码暂存文件
5.通过提示信息判断验证是否成功
5.1如果有验证码输入正确的提示信息,则表明成功
5.2如果没有验证输入正确的提示信息,则本次获取失败
5.2.1本次失败后,利do-loop循环控制,换另一个验证码,继续1-5步操作,
     在限定的次数内若有一次成功则则退出循环;若达到限定的次数仍然没有成功,退出循环.
 
具体步骤:
1.下载并安装windows版tesseract-ocr
tesseract-ocr目前最新版为3.01,下载地址为:http://code.google.com/p/tesseract-ocr/downloads/detail?name=tesseract-ocr-setup-3.01-1.exe&can=2&q=
,下载之后运行安装文件,按照步骤安装即可。安装完成后在Dos窗口执行命令:tesseract,出现以下信息,表明安装成功。
Usage:tesseract imagename outputbase [-l lang] [-psm pagesegmode] [configfile...]
pagesegmode values are:
0 = Orientation and script. detection (OSD) only.
1 = Automatic page segmentation with OSD.
2 = Automatic page segmentation, but no OSD, or OCR
3 = Fully automatic page segmentation, but no OSD. (Default)
4 = Assume a single column of text of variable sizes.
5 = Assume a single uniform. block of vertically aligned text.
6 = Assume a single uniform. block of text.
7 = Treat the image as a single text line.
8 = Treat the image as a single word.
9 = Treat the image as a single word in a circle.
10 = Treat the image as a single character.
-l lang and/or -psm pagesegmode must occur before anyconfigfile.
 
2.准备启动tesseract的批处理文件
    有tesseract-ocr是一个开源的ocr引擎,它仅支持命令行,通过步骤1的信息,我们可能已经知道,获取验证码的命令为:tesseract imagename outputbase [-l lang]
参数:
  tesseract:启动tesseract-ocr获取验证码的命令
  imagename:图片文件的名称(仅支持bmp、tif格式文件)
  outputbase:获取的验证的存放文件(不需要后缀名,创建文件时会自动加上txt后缀名)
  -l :语言选项,非必选项,tesseract支持很多图片验证码语言,可以在步骤1的wiki地址中下载语言包安装
  lang:语言,如果你的验证码为字母,可以选择eng,具体的语言包安装在tessdata目录下,后缀名为traineddata,文件名为语言。例如:eng.traineddata,语言为eng(英文)
新建文件StartTesseract-ocr.bat,编辑文件输入如下命令,将文件保存某个路径(本次保存在D:\QTPAtuomationTestFrame\Library\Config):
 d:
 cd ..\..\..\..\..\..\..\..
 cd D:\QTPAtuomationTestFrame\Temp
 tesseract temp.bmp r -l eng

3.准备删除验证码图片和验证码暂存文件的批处理文件
新建文件DelFile.bat,编辑文件输入如下命令,将文件保存在某个路径(本次保存在D:\QTPAtuomationTestFrame\Library\Config):
 d:
 cd ..\..\..\..\..\..\..\..
 cd D:\QTPAtuomationTestFrame\Temp
 del r.txt
 del temp.bmp
 
4.准备获取验证码的函数
    根据“验证码获取脚本设计思路:”中的1-4步,设计如下代码(本函数中的路径可以根据实际路径进行修改,或者为了更好的扩张复用可以讲路径作为参数传入),保存以下代码为getVerificationCode.vbs,将文件存放于某路径(本次存放于D:\QTPAtuomationTestFrame\Library\Functions\GeneralFunctions):
'######################函数##################################
'******************************************************
'功能:利用开源tesseract-ocr引擎获取图片验证码
'参数:objImage 验证码图片对象
'******************************************************
Function getVerificationCode(objImage)
   '保存验证码图片
   objImage.CaptureBitmap "D:\QTPAtuomationTestFrame\Temp\temp.bmp",True
   Set WSH = CreateObject("Wscript.Shell")
   Set FSO = CreateObject("Scripting.FileSystemObject")
   '调用批处理,启动Tesseract-ocr获取验证码
   oWSH.Run "D:\QTPAtuomationTestFrame\Library\Config\StartTesseract-ocr.bat"
   Wait 1
   '打开验证码获取结果文件
   Set File= FSO.OpenTextFile("D:\QTPAtuomationTestFrame\Temp\r.txt")
   '获取结果文件内容,并去除空格
 getVerificationCode = Replace(oFile.ReadLine()," ","")
   Set File =  Nothing
   Set FSO = Nothing
   '调用批处理,删除图片文件及结果文件
 oWSH.Run "D:\QTPAtuomationTestFrame\Library\Config\DelFile.bat"
 Set WSH = Nothing
End Function
 
5.业务脚本编写
5.1 将需要的对象手动添加到对象库
    手动添加对象到对象库就不说明了,很简单
5.2 根据测试需求,添加相应对象操作步骤代码,到专家视图
    从qtp的available keywords的test object中添加需要的步骤到专家视图(怎么添加请看帮助文档)
5.3 加载获取验证码外部函数
  加载外部函数有动态加载和静态加载两种方式,这里采用动态加载的方式,在专家视图的代码最开始输入以下代码:
executefile "D:\QTPAtuomationTestFrame\Library\Functions\GeneralFunctions\getVerificationCode.vbs"
5.4 代码增强
结合“验证码获取脚本设计思路:”中的步骤5,增强代码,本次设定了最多变换验证码20次,增强后的代码如下:
'加载外部验证码函数
executefile "D:\QTPAtuomationTestFrame\Library\Functions\GeneralFunctions\getVerificationCode.vbs"
'打开国美网上商城首页
SystemUtil.Run "http://www.gome.com.cn/ec/homeus/index.html"
'########################对象封装##############################
Set bjBrowser = Browser("国美电器网上商城-国美电器唯一官方网上商城,中国领先专业的家")
Set bjIndexPage = objBrowser.Page("国美电器网上商城-国美电器唯一官方网上商城,中国领先专业的家")
Set bjRegPage = objBrowser.Page("免费注册-国美电器网上商城")
Set bjImage =  objRegPage.Image("captcha")
Set bjTips =  objRegPage.WebElement("验证码输入正确")
'####################验证码输入业务操作######################
'进入注册界面
objIndexPage.Link("注册").Click
With objRegPage
 '输入验证码
 .WebEdit("/atg/store/profile/Registratio").Set getVerificationCode(objImage)
'判断验证码输入成功提示信息是否存在
 If objTips.Exist(2) Then
  Msgbox "验证码获取正确"
 Else
  '定义计数器
  Dim i
  i=1
  Do
    '换其他验证码
    objImage.Click
    Set bjImage =  .Image("captcha")
    '输入验证码
    .WebEdit("/atg/store/profile/Registratio").Set getVerificationCode(objImage)
    '计数器,每循环一次加1
    i = i+1
  Loop Until (objTips.Exist(2) Or i=20)'当验证码在规定换图片的次数内成功,则立即结束循环,最多换i次
 End If
End With
5.5 保存脚本
    将自动化测试脚本保存
 
6.回放脚本
  到此本次分享结束
 
总结:
   tesseract-ocr对一些简单的图片验证码的识别率还是非常高的,但是复杂的图片验证码识别率较低,任何ocr工具都存在识别率的问题,如果你的项目适合使用tesseract-ocr的话,不防试试,当有时能成功识别有时会识别的情况,实现的过程中可以采取一些变通的策略(例如采用循环多次变换验证码等),或许会峰会路转。
 
 

TAG: 图片验证码 QTP qtp tesseract

 

评分:0

我来说两句

Open Toolbar