51Testing软件测试论坛

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

QQ登录

只需一步,快速开始

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

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

[复制链接]

该用户从未签到

发表于 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机制存在一个“识别率(也就是正确率)”的概率,我们不能指望依靠它每次都能正确识别出文本。

所以最好的方法,还是让开发人员把验证码改为万能验证码最好,呵呵!
回复

使用道具 举报

该用户从未签到

发表于 2008-10-20 00:03:13 | 显示全部楼层
不错,学习了,思路值得学习,,
回复 支持 反对

使用道具 举报

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

    连续签到: 1 天

    [LV.1]测试小兵

    发表于 2008-10-20 10:03:24 | 显示全部楼层
    看到了 来见识一下 看看 自己能不能成功 哈哈
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-20 10:42:33 | 显示全部楼层
    又学到新的验证码获取方式啦,
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.1]测试小兵

    发表于 2008-10-20 11:02:02 | 显示全部楼层
    恩 自己在测试的时候 还是没有测试成功  
    回复 支持 反对

    使用道具 举报

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

    连续签到: 1 天

    [LV.1]测试小兵

    发表于 2008-10-20 11:02:51 | 显示全部楼层
    Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Output CheckPoint("Internet Explorer_Server")
    运行的时候 提示不支持
    回复 支持 反对

    使用道具 举报

    该用户从未签到

     楼主| 发表于 2008-10-20 12:05:48 | 显示全部楼层
    注意,我这里用两个脚本来做,你说的这句话我是用一个不加载web插件的方式来添加文本区域输出值的。
    你可以试一下,这句话必须你自己去添加上!

    原帖由 tiger_86 于 2008-10-20 11:02 发表
    Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Output CheckPoint("Internet Explorer_Server")
    运行的时候 提示不支持
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-20 14:04:50 | 显示全部楼层
    我又学习了一次。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-21 10:45:00 | 显示全部楼层
    老师真好。。。顶你。。。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-22 20:06:17 | 显示全部楼层

    好技术

    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-24 15:18:48 | 显示全部楼层
    传说中的高手应该就是这样牛的,崇拜啊
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-27 12:21:16 | 显示全部楼层
    真强悍!
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-28 11:02:33 | 显示全部楼层
    宋老大,我崇拜你也~~。。。

    我正好在研究这方面的知识。
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-28 15:04:39 | 显示全部楼层
    xiexieni~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-9-20 12:50
  • 签到天数: 2 天

    连续签到: 1 天

    [LV.1]测试小兵

    发表于 2008-10-28 22:51:30 | 显示全部楼层
    刚收此贴我用的上,做web测试,又要学QTP。多谢LZ了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-29 12:01:57 | 显示全部楼层
    学习了,正再努力学习QTP中
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-29 13:11:47 | 显示全部楼层
    rft怎么做?
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-29 15:46:02 | 显示全部楼层
    试验了一下,运行是通过了,但有个问题需要注意:

    在运行这个脚本的之前,必须要将已打开的IE浏览器全部关闭。才能保证脚本的顺利运行。

    我的猜想是:由于"Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Output CheckPoint("Internet Explorer_Server"),是基于windows对象去抓取的,所以当有两个IE同时打开时,QTP在运行脚本时无法识别到底哪个ie对象需要它来识别.

    对于这个猜想,欢迎探讨。
    "
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-31 11:59:35 | 显示全部楼层
    按照你的方法,我还是抓不到 验证码,查看了一下report,

    Output the text into Internet_Explorer_ServerOutput_Text_out DataTable output value.
    Captured text is: (null)
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    发表于 2008-10-31 13:31:00 | 显示全部楼层
    将IE最大化,解决了Null的问题,但取到的值与图片验证码上的值却不一致。

    Output the text into Internet_Explorer_ServerOutput_Text_out Environment output value.
    Captured text is: "s ^r mng"
    回复 支持 反对

    使用道具 举报

    本版积分规则

    关闭

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

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

    GMT+8, 2019-12-10 19:39 , Processed in 0.088942 second(s), 27 queries .

    Powered by Discuz! X3.2

    © 2001-2019 Comsenz Inc.

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