51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

测试开发精英班,通向高级软件测试工程师【周活动】 找茬--心里圈的故事 !【长期招募】博为峰网校招聘兼职讲师!横扫BAT,Python全栈测试开发技能大全
【109期】:python爬虫的魔力 !双11剁手不吃土,来投稿赚回血红包! 【专题】用尽一切办法只为让你学好用例 自学软件测试那点事
查看: 18214|回复: 31

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

[复制链接]

该用户从未签到

发表于 2008-10-10 19:24:18 | 显示全部楼层 |阅读模式
大家在使用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)



(二)、内容是songfun的普通文本,QTP获取正确;内容是songfun的G风格彩字,QTP获取错误(也显示为IC_CHECK_PATTERN)




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

使用道具 举报

该用户从未签到

发表于 2008-10-10 20:17:57 | 显示全部楼层
好贴!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2008-10-13 14:25:18 | 显示全部楼层
厉害!又学习了!
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2008-10-13 14:55:13 | 显示全部楼层
怎么跟我现在的项目这么靠近,^_^。
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2008-10-14 14:53:00 | 显示全部楼层
我尝试捕获web页面上的验证码,但是创建text area output->选择IE里面的图形验证码区域后,报错“The object you selected does not support this operation”。

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

难道捕获IE页面里的图形,有什么特殊的地方吗?
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2008-10-14 16:28:31 | 显示全部楼层
我也遇到同5楼同样的问题,继续关注
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2008-10-14 18:20:00 | 显示全部楼层
能说的具体点吗?还是不会操作
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2008-10-14 18:28:03 | 显示全部楼层
我改用用maxthon进行获取,识别成功。因为maxthon被当作一个应用程序,而不是浏览器。

IE的问题在哪里呢?
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2008-10-14 22:04:40 | 显示全部楼层
如果你测试的是Web系统,并且使用IE浏览器,那么可以尝试使用Text Output Value而不是 Text Area Output Value,因为QTP中,web不支持文本区域输出值。具体的你可以看看帮助。


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

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

难道 ...
回复 支持 反对

使用道具 举报

该用户从未签到

 楼主| 发表于 2008-10-14 22:05:50 | 显示全部楼层
你希望怎么具体?说来听听

原帖由 password 于 2008-10-14 18:20 发表
能说的具体点吗?还是不会操作
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2008-10-15 09:17:50 | 显示全部楼层
是啊,把代码共享一下啊。
我写了后发现提示为空,感觉没有识别出来
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2008-10-15 10:54:58 | 显示全部楼层
原帖由 songfun 于 2008-10-14 22:04 发表
如果你测试的是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 编辑 ]
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2008-10-16 16:22:48 | 显示全部楼层
在验证码的位置只有insert output value,这里面没有对验证码的操作
回复 支持 反对

使用道具 举报

该用户从未签到

发表于 2008-10-17 11:36:56 | 显示全部楼层
我的Test output Value为什么是灰色的。并且
Window("Windows 图片和传真查看器").WinObject("ShImgVw:CZoomWnd")
没有output属性呀。
新手。请教一下。谢谢了
回复 支持 反对

使用道具 举报

  • TA的每日心情
    开心
    2016-8-25 10:16
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    发表于 2008-10-17 14:41:37 | 显示全部楼层
    建议 楼主 能给一个 具体的操作 看着可能要好一点的 哈哈
    谢谢 现在需要这样的技术 哈哈
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-17 16:09:18 | 显示全部楼层
    越来越强了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2008-10-19 23:13:36 | 显示全部楼层
    已经写了第二篇文章,做了具体的操作讲解。链接:http://bbs.51testing.com/thread-129864-1-1.html


    原帖由 tiger_86 于 2008-10-17 14:41 发表
    建议 楼主 能给一个 具体的操作 看着可能要好一点的 哈哈
    谢谢 现在需要这样的技术 哈哈
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-20 11:01:07 | 显示全部楼层
    强悍啊~看来9.5还是很值得一用的~~
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-20 11:21:13 | 显示全部楼层
    是不是这个方法对9.0不管用呀
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2008-10-20 12:06:45 | 显示全部楼层
    9.0没有这个支持,只有9.5才有,呵呵
    原帖由 angelia_liu 于 2008-10-20 11:21 发表
    是不是这个方法对9.0不管用呀
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2019-12-12 10:00 , Processed in 0.079531 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2019 Comsenz Inc.

    快速回复 返回顶部 返回列表