QTP-使用OCR技术获取图片验证码

下表为qtp在不同的环境(插件)下对各类检查点的支持情况:

由上图可见,QTP加载了WEB addin后,就不支持text area output checkpoint,如果用text area output value去获取文本值的话,提示:“The object you selected does not support this operation”

先来看下文本识别机制

指定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要使用这种方式。
我已经试验过是可以成功的哦。

言归正传,在window模式下,qtp支持text area output value,所以我们可以先把web addin去掉,来捕获对象文本内容

1.在qtp启动时勾掉web addin,然后开始录制,选择Insert->output value->text area output value,鼠标变成之字形然后把所要获取对象文本的区域选中(这里录制的是百度注册页面),如下图:

点击"OK"

点击"OK"然后保存脚本为GetCharTest,脚本代码:Window("Microsoft Internet Explorer").WinObject("Internet Explorer_Server").Output CheckPoint("Internet Explorer_Server")

可以输入Set text=DataTable.GetSheet("Global").GetParameter("Internet_Explorer_ServerOutput_Text_out")
msgbox text   来查看文本内容
2.关掉QTP,再打开QTP,选中web addin录制脚本,录制完成后把第一步录制的脚本通过insert call to copy of action添加进去

脚本如下:

Dim myCode
Browser("百度用户注册").Page("百度用户注册").WebEdit("username").Set DataTable("username", dtGlobalSheet)
Browser("百度用户注册").Page("百度用户注册").WebEdit("loginpass").SetSecure "4ec464f8735b7a43e936bed4711b14866c4fe932f1211c20803caf79"
Browser("百度用户注册").Page("百度用户注册").WebEdit("verifypass").SetSecure "4ec464fda5f5858ea1f948024dfaae5bd4955cad1d5307aee397c26c"
Browser("百度用户注册").Page("百度用户注册").WebEdit("email").Set "zy66688@12.com"
Browser("百度用户注册").Page("百度用户注册_2").WebEdit("verifycode").Click
RunAction "GetChar", oneIteration,myCode
Set myCode=DataTable.GetSheet("Global").GetParameter("Internet_Explorer_ServerOutput_Text_out")
msgbox myCode
Browser("百度用户注册").Page("百度用户注册_2").WebEdit("verifycode").Set "NYRA"
Browser("百度用户注册").Page("百度用户注册_2").WebButton("同意以下协议并提交").Drag 84,16
Browser("百度用户注册").Page("百度用户注册_3").Sync

3.回放脚本,由于受多种因素的影响,这种方法大部分识别的都有错误,但脚本是可以通过的。。



首先要解释下,上次那篇文章告诉大家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机制存在一个“识别率(也就是正确率)”的概率,我们不能指望依靠它每次都能正确识别出文本。

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

转自:http://bbs.51testing.com/thread-129864-1-1.html


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值