51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

微信登录,快人一步

查看: 67778|回复: 112
打印 上一主题 下一主题

[原创] 如何用QTP获取网页中的图片验证码(二)--OCR的妙用

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2008-10-19 23:05:07 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
自从几天前,我在blog中发表了《如何用QTP解决图片验证码(解析QuickTest文本识别机制)?》,就收到不少网友的短消息,要求我做一个基于Web的具体例子,来演示QTP读取图片验证码的效果。
既然盛情难却,在下就 以 BBSXP 为例,给大家来个 step by step吧
首先要解释下,上次那篇文章告诉大家QTP的文本(Text)/文本区域(Text Area)输出值可以获取图片的文本内容,但是这不等于在基于Web的测试中,就可以直接应用这个方法来获取文本内容。因为QTP中,当你加载了Web Addin后,它就不支持文本区域检查点了(具体可以参考帮助文档,也可以参考下图)!


因此,如果用文本区域输出值(Text Area Output)试图去获取值的时候,QTP会提示你“The object you selected does not support this operation(你所选择的对象不支持此操作)”。
那么,如果改用文本输出值(Text Output)又会怎么样呢?结果又让人失望了,它提示“Cannot Retrieve text for this object(无法从这种对象上获取文本)”!
这下晕了,好不容易找到了取值方式,却两种方式都不支持。
怎么办呢?………………既然此路不通,咱们就绕道而行吧!

仔细看看上面那张图,我们可以看到,其实QTP是支持在Standard Windows(标准Windows)对象中使用文本区域输出值(Text Area Output)的,既然如此,我们何不让QTP在这个时候卸掉web插件,以windows方式去抓取这个对象呢?
有了解决的思路,一切就好办了——我们做两个脚本就能解决这个问题。

下面是具体的解决步骤:
1、先单独录制一个不加载web插件的脚本,这个脚本只做一件事——就是以Text Area方式去取图片验证码中的值。

对应的代码就是:
  1. Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Output CheckPoint("Internet Explorer_Server")
复制代码
从上面代码我们可以看到,我强迫让QTP把浏览器当做一个普通的Windows对象来识别,而不是一个Web对象去识别。
2、把这个脚本的Action改个易理解的名字,就叫GetChar吧,然后在这个Action上面加一个Action Output parameters,参数名叫AuthCode。
下面有图能看到。
3、把这个脚本保存下来,脚本就叫GetCodeText吧。然后关掉QTP。
4、现在再打开QTP,做第二个脚本。记得这一次在插件管理器里记得要勾选上对应的Web插件了!录制一段注册论坛用户名的脚本,并把其中验证码的输入部分参数化,代码如下:
  1. Option Explicit
  2. Dim myCode
  3. SystemUtil.Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE","","C:\Documents and Settings\Administrator","open"
  4. Browser("Browser").Page("Page").Sync
  5. Browser("Browser").Navigate "http://bbs.yuzi.net/CreateUser.asp"
  6. Browser("Browser").Page("互动交流平台 - Powered By BBSXP").WebEdit("UserName").Set "songfun"
  7. Browser("Browser").Page("互动交流平台 - Powered By BBSXP").WebEdit("UserEmail").Set "songfun@51testing.com"
  8. Browser("Browser").Page("互动交流平台 - Powered By BBSXP").WebEdit("VerifyCode").Click
  9. RunAction "GetChar", oneIteration,myCode
  10. Browser("Browser").Page("互动交流平台 - Powered By BBSXP").WebEdit("VerifyCode").Set myCode
  11. Browser("Browser").Page("互动交流平台 - Powered By BBSXP").WebList("PasswordQuestion").Select "最喜欢的老师"
  12. Browser("Browser").Page("互动交流平台 - Powered By BBSXP").WebEdit("PasswordAnswer").Set "songfun老师"
复制代码
注意:在代码中有一句RunAction,其实是我在这里做了一个“Call to Copy of Action”动作,把刚才那个GetCodeText脚本中的名叫GetChar的Action给加载进来了(强调下,必须是以Action嵌套方式而不是并列方式来调用的)。
具体代码和形式如图:


5、脚本做好之后,点击Run,看看它的效果。如图:


看看效果,是不是已经成功了?呵呵呵!
接下来换Baidu来看看,
你会发现在百度注册里有时成功有时失败——为什么呢?因为百度的图片加入了干扰素(什么是干扰素,可以参考我上一篇文章《如何用QTP解决图片验证码(解析QuickTest文本识别机制)?》),因此有些时候会识别不出。
所以这回到我们上次所说的,OCR机制存在一个“识别率(也就是正确率)”的概率,我们不能指望依靠它每次都能正确识别出文本。

所以最好的方法,还是让开发人员把验证码改为万能验证码最好,呵呵!
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏5
回复

使用道具 举报

该用户从未签到

113#
发表于 2016-7-6 16:31:53 | 只看该作者
我用的UFT11.5,是不是无法把加载的web插件单独去掉,那也就实现不了楼主所说的了吧
回复 支持 反对

使用道具 举报

该用户从未签到

111#
发表于 2015-2-5 14:09:06 | 只看该作者
The "Microsoft Internet Explorer" Window object was not found in the Object Repository.
Check the Object Repository to confirm that the object exists or to find the correct name for the object.

Line (1): "Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Output CheckPoint("Internet Explorer_Server")".

Tip: If the objects in your application have changed, the Maintenance Run Mode can
help you identify and update your steps and/or the objects in your repository
回复 支持 反对

使用道具 举报

该用户从未签到

110#
发表于 2014-8-15 21:25:55 | 只看该作者
有机会再新项目中试下,感谢,MARK
回复 支持 反对

使用道具 举报

该用户从未签到

109#
发表于 2014-8-15 21:25:19 | 只看该作者
有机会再新项目中试下,感谢,MARK
回复 支持 反对

使用道具 举报

该用户从未签到

108#
发表于 2014-1-6 15:40:13 | 只看该作者
回复 7# songfun


    怎么添加的 ?
回复 支持 反对

使用道具 举报

该用户从未签到

107#
发表于 2013-12-30 16:53:31 | 只看该作者
楼主,虽然帖子貌似有些久了,但是我还是想问下,Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Output CheckPoint("Internet Explorer_Server")这句脚本在QTP11.5中为什么运行会报类型不匹配的错误呢?  而且我试了一下,WinObject貌似,没有output这个动作了,难道是因为版本问题?
回复 支持 反对

使用道具 举报

  • TA的每日心情
    奋斗
    2015-11-22 11:20
  • 签到天数: 78 天

    连续签到: 1 天

    [LV.6]测试旅长

    106#
    发表于 2013-9-12 16:49:29 | 只看该作者
    值得学习
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    105#
    发表于 2013-7-26 16:34:55 | 只看该作者
    终于弄通了,有几个地方楼主没给新学qtp的同学讲清楚,
    1。第1步中,在录制的时候,点了验证码输入框,图片 ...
    debug1984 发表于 2010-10-27 12:52



        谢谢这位同学,同时更感谢楼主
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    104#
    发表于 2013-7-2 11:29:23 | 只看该作者
    学习了!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    103#
    发表于 2012-9-21 15:35:44 | 只看该作者
    好帖子~ 回头实践下
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    102#
    发表于 2012-4-27 12:00:01 | 只看该作者
    麻烦您我是笨人,根本没明白您能不能做个视频行不行
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    101#
    发表于 2012-4-27 11:59:48 | 只看该作者
    麻烦您我是笨人,根本没明白您能不能做个视频行不行
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    100#
    发表于 2012-3-21 11:42:22 | 只看该作者
    学习中
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    99#
    发表于 2012-3-2 17:07:59 | 只看该作者
    我也没有试验成功,可不可以录一段视频讲解上传啊!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    98#
    发表于 2012-2-22 00:19:26 | 只看该作者
    好贴,学习了!可惜这个方法识别率不是很高,遇到奇葩些的验证码图片只能靠其他办法解决了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    97#
    发表于 2012-2-22 00:17:28 | 只看该作者
    学习了!可惜这个方法识别率不是很高,遇到奇葩些的验证码图片就只能靠其他办法解决了。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    96#
    发表于 2012-2-15 11:33:46 | 只看该作者
    回复 18# 王爬爬


        想让QTP可以操作多个页面有个方法:
    用SystemUtil.run打开多个Browser
    ,再用CreateTime属性的值去定义页面打开的顺序

    供参考
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    95#
    发表于 2012-2-15 11:30:01 | 只看该作者
    这个必须收藏了
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2024-5-11 21:27 , Processed in 0.102328 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

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