在Web项目的自动化测试中,经常需要处理验证码识别的问题。主流上有两种方法,第一种是使用万能验证码或屏蔽验证码,第二种就是人工输入验证码。其实还有一种办法,只是效果并不太好,这种方法就是使用OCR识别。网络上有很多基于OCR识别技术的工具、引擎以及一些web服务,它们对于识别一些简单的验证码是有一定的效果的,但是对于比较复杂的验证码(比如增加了一些模糊功能或者多种语言文字组合)识别效果并不太理想。此处将使用一款开源的OCR引擎(Tesseract)来解决AutoIT自动化测试中验证码识别的问题。
Tesseract原本由惠普开发,在一段时间内因为一些原因没有更新,Google于2006年重启了这个项目,目前已经发布到了3.01版本。
首先下载Tesseract并进行安装。安装完成之后,做一个小的实验。将一张验证码图片放置到“C:\”。运行CMD,输入命令:
“tesseract.exe c:\1.jpg c:\1 -1”
查看“C:\”下是否生成了一个名为“1.txt”的文本,并查看文本中的识别结果。
由此,可以看出图片中的验证码已经被Tesseract识别出来。
使用Tesseract可以从图片中识别出验证码来,那么自动化测试中处理验证码的第一步就是从应用中把验证码图片抠出来。下面的这段代码即实现了这样的处理。
While Not CheckLinkExistByText($OIE,"退出>>")
;MsgBox(1,"num","第"&$i&"次")
Local $Inputcheck= _IEGetObjByName($OIE,"txtValidateCode")
Local $oImg = _IEGetObjById($oIE,"vcodeimg")
$oPic = $oIE.Document.body.createControlRange()
$oPic.Add($oImg)
$oPic.execCommand("Copy")
$bmp = ClipGet()
FileCopy($bmp,"c:\1.jpg",1)
$cmd = "tesseract.exe c:\1.jpg c:\1 -1"
Run(@ComSpec & " /k "&$cmd,"",@SW_HIDE)
Sleep(2000)
$file = FileOpen("c:\1.txt", 0)
$checkCode=FileRead($file,4)
;MsgBox(1,"识别为",$checkCode)
FileClose($file)
$Inputcheck.value = $checkCode
Local $Inputname = _IEGetObjByName($OIE,"txtUserName")
Local $InputPWD = _IEGetObjByName($OIE,"txtPassword")
Local $LoginBtn = _IEGetObjByName($OIE,"btnLogin")
$Inputname.value=$Tester
$InputPWD.value=$TesterPWD
$LoginBtn.click
_IELoadWait($OIE)
ProcessClose("cmd.exe")
$i=$i+1
Wend
这段代码的思想就是,当识别出来的验证码输入后登录不成功,就重新获取验证码图片再识别再次尝试,直到识别出正确的验证码。
注意到这段代码:
$cmd = "tesseract.exe c:\1.jpg c:\1 -1"
Run(@ComSpec & " /k "&$cmd,"",@SW_HIDE)
即使用CMD命令来执行Tesseract的识别。
Tesseract还具有很强大的训练功能,可以利用训练功能增强Tesseract的识别能力。