songfun 发表于 2008-10-10 19:24:18

如何用QTP解决图片验证码(解析QuickTest文本识别机制)?

大家在使用QTP进行自动化测试的过程中经常会遇到图片验证码的问题——大家所关心的就是如何解决此类问题。
这里我们首先要去了解为什么会有图片验证码。其实验证码的本质作用就是防止有人利用工具(灌水机、注册机,当然也不小心包括了我们的自动化测试工具)恶意猜解登陆或者不停的注册和灌水的。因此如果我们完全寄希望于通过GUI识别来获取内容是不切实际的——先打好预防针,免得读者希望太大,失望更大,呵呵!
下面说说验证码的解决思路:
其实解决图片验证码的思路有很多,我这里主要结合QTP9.5的新特性给大家介绍其中一种解决方案,就是利用它的OCR机制抓取文本内容。
在QTP9.5中,对象识别能力有了进一步改善,其中针对文本识别方面进行了优化,引入了ABBYY公司的OCR解决方案——这个相关的功能体现在QTP菜单的“Tools-->Options-->General--Use text recognition mechanisms in this order”里,详细内容后面会有具体介绍。
先来看看ABBYY是何许公司,登录他们的官方网站可以看到一段相关介绍:“ABBYY是世界OCR(光学字符识别)、ICR(手写体识别)和语言软件的领航者。ABBYY 致力于人工智能(AI)和语言软件开发。提供全套文档识别,转换和数据捕获技术的产品解决方案。”如果你使用过图像文档转换的软件,一定会听说过FineReader OCR Professional ,其实它就是ABBYY公司的产品,用官方的说法就是“将通过扫描仪、MFP 或数码相机生成的图像快速转换为可编辑和可搜索的电子格式,而且识别率很高”,说白了就是可以借助它先进的OCR机制“读”出图片里的文本内容,并转换为PDF之类的文档。
有了ABBYY这么强大的背后支持,QTP自然底气十足,那么QTP到底如何以OCR机制识别文本呢?我们首先先了解一下什么是OCR。
打开“百度百科_OCR”,它的说明:“OCR(Optical Character Recognition,光学字符识别),是属于图型识别(Pattern Recognition,PR)的一门学问。其目的就是要让计算机知道它到底看到了什么,尤其是文字资料。 由于OCR是一门与识别率拔河的技术,因此如何除错或利用辅助信息提高识别正确率,是OCR最重要的课题,ICR(Intelligent Character Recognition)的名词也因此而产生。而根据文字资料存在的媒体介质不同,及取得这些资料的方式不同,就衍生出各式各样、各种不同的应用。”这里有个关键词:“正确率”,也就是“识别率”——既然不能够总是100%,我们自然不可能完全寄希望于通过QTP能够每次100%正确的去识别图片里的文本。尤其是“道高一尺魔高一丈”的今天,验证码加入了大量的干扰素,如扭曲、变形、错位、随机背景花纹,给OCR识别增加了很多难度——本来就不希望被软件识别到嘛。

了解了OCR之后,我们再来看看QTP对应的这个设置。如前面所说,通过QTP菜单的“Tools-->Options”选中到“General--Use text recognition mechanisms in this order”,这里的四个选项就是对应的不同设置。我们看看帮助的描述(我做了翻译):
=================================
使用文本识别机制

指定QTP在采用 “文本”或者“文本区域” 的 检查点或输出值 的步骤时,捕获文本内容所使用的文本识别机制。
以下有三种识别方式:
1、先使用Windows API,再使用OCR(默认)。
    指示QTP首先尝试以基于Windows API的机制从对象上直接获取文本内容。如果未获取到文本(比如,文本属于图片的一部分),QTP就会使用OCR的机制尝试获取这段文本。
    强烈建议在使用中日韩(象形文字)、英的语言环境下采用这个设置。

2、先使用OCR,再使用Windows API。
    指示QTP首先尝试使用OCR机制从对象上去获取文本。如果未获取到文本,QTP就会以Windows API的机制去获取文本内容。

3、仅使用Windows API方式。
    指示QTP仅采用基于Windows API的机制从对象上获取文本内容。

4、仅使用OCR的方式。
    指示QTP仅采用基于OCR的机制从对象上获取文本内容。
    在使用Windows Vista要使用这种方式。

=================================
上面的内容已经解释的很明确了,接下来我们通过TextArea Output Value看看效果。

如下图所示,QTP针对几张图片的识别效果:
(一)、内容是51Testing的,QTP获取正确;内容是51Testing的G风格彩字,QTP获取错误(显示为IC_CHECK_PATTERN)
http://www.51testing.com/attachments/2008/10/35_200810101910132.gif
http://www.51testing.com/attachments/2008/10/35_200810101910131.jpg
http://www.51testing.com/attachments/2008/10/35_200810101910133.gif
(二)、内容是songfun的普通文本,QTP获取正确;内容是songfun的G风格彩字,QTP获取错误(也显示为IC_CHECK_PATTERN)
http://www.51testing.com/attachments/2008/10/35_200810101910135.gif
http://www.51testing.com/attachments/2008/10/35_200810101910134.gif
http://www.51testing.com/attachments/2008/10/35_200810101910136.jpg

有兴趣大家可以自己做一些图片,甚至可以用QQ的验证码图片来试验一下,看看OCR效果。

假装不在 发表于 2008-10-10 20:17:57

好贴!:lol

dionysus 发表于 2008-10-13 14:25:18

厉害!又学习了!

heqingbluesky 发表于 2008-10-13 14:55:13

怎么跟我现在的项目这么靠近,^_^。

berylz 发表于 2008-10-14 14:53:00

我尝试捕获web页面上的验证码,但是创建text area output->选择IE里面的图形验证码区域后,报错“The object you selected does not support this operation”。

但是捕获图话板里面的图形,则没有问题。

难道捕获IE页面里的图形,有什么特殊的地方吗?

faro213108 发表于 2008-10-14 16:28:31

我也遇到同5楼同样的问题,继续关注

password 发表于 2008-10-14 18:20:00

能说的具体点吗?还是不会操作

berylz 发表于 2008-10-14 18:28:03

我改用用maxthon进行获取,识别成功。因为maxthon被当作一个应用程序,而不是浏览器。

IE的问题在哪里呢?

songfun 发表于 2008-10-14 22:04:40

如果你测试的是Web系统,并且使用IE浏览器,那么可以尝试使用Text Output Value而不是 Text Area Output Value,因为QTP中,web不支持文本区域输出值。具体的你可以看看帮助。


原帖由 berylz 于 2008-10-14 14:53 发表 http://bbs.51testing.com/images/common/back.gif
我尝试捕获web页面上的验证码,但是创建text area output->选择IE里面的图形验证码区域后,报错“The object you selected does not support this operation”。

但是捕获图话板里面的图形,则没有问题。

难道 ...

songfun 发表于 2008-10-14 22:05:50

你希望怎么具体?说来听听

原帖由 password 于 2008-10-14 18:20 发表 http://bbs.51testing.com/images/common/back.gif
能说的具体点吗?还是不会操作

trademark 发表于 2008-10-15 09:17:50

是啊,把代码共享一下啊。
我写了后发现提示为空,感觉没有识别出来

berylz 发表于 2008-10-15 10:54:58

原帖由 songfun 于 2008-10-14 22:04 发表 http://bbs.51testing.com/images/common/back.gif
如果你测试的是Web系统,并且使用IE浏览器,那么可以尝试使用Text Output Value而不是 Text Area Output Value,因为QTP中,web不支持文本区域输出值。具体的你可以看看帮助。




我尝试用Text Output Value,但是提示“Cannot retrieve text for this object”。
翻遍了user guide,其中只是提及
“When checking text, QuickTest tries to retrieve the text directly from the
object. If QuickTest cannot retrieve the text in this manner (for example,
because the text is part of a picture), it tries to retrieve the text using an OCR
(optical character recognition) mechanism.”
但是没有详细描述,如何能使用OCR获取web的图形文字。

能否告知哪个帮助文档中有详细描述?

[ 本帖最后由 berylz 于 2008-10-17 15:15 编辑 ]

password 发表于 2008-10-16 16:22:48

在验证码的位置只有insert output value,这里面没有对验证码的操作

ly200361 发表于 2008-10-17 11:36:56

我的Test output Value为什么是灰色的。并且
Window("Windows 图片和传真查看器").WinObject("ShImgVw:CZoomWnd")
没有output属性呀。
新手。请教一下。谢谢了

tiger_86 发表于 2008-10-17 14:41:37

建议 楼主 能给一个 具体的操作 看着可能要好一点的 哈哈
谢谢 现在需要这样的技术 哈哈

centurystone 发表于 2008-10-17 16:09:18

越来越强了

songfun 发表于 2008-10-19 23:13:36

已经写了第二篇文章,做了具体的操作讲解。链接:http://bbs.51testing.com/thread-129864-1-1.html


原帖由 tiger_86 于 2008-10-17 14:41 发表 http://bbs.51testing.com/images/common/back.gif
建议 楼主 能给一个 具体的操作 看着可能要好一点的 哈哈
谢谢 现在需要这样的技术 哈哈

hsjzfling 发表于 2008-10-20 11:01:07

强悍啊~看来9.5还是很值得一用的~~:lol

angelia_liu 发表于 2008-10-20 11:21:13

是不是这个方法对9.0不管用呀

songfun 发表于 2008-10-20 12:06:45

9.0没有这个支持,只有9.5才有,呵呵
原帖由 angelia_liu 于 2008-10-20 11:21 发表 http://bbs.51testing.com/images/common/back.gif
是不是这个方法对9.0不管用呀
页: [1] 2
查看完整版本: 如何用QTP解决图片验证码(解析QuickTest文本识别机制)?