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次,增强后的代码如下:
'########################对象封装##############################
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
6.回放脚本
到此本次分享结束
总结:
tesseract-ocr对一些简单的图片验证码的识别率还是非常高的,但是复杂的图片验证码识别率较低,任何ocr工具都存在识别率的问题,如果你的项目适合使用tesseract-ocr的话,不防试试,当有时能成功识别有时会识别的情况,实现的过程中可以采取一些变通的策略(例如采用循环多次变换验证码等),或许会峰会路转。