自从几天前,我在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方式去取图片验证码中的值。
对应的
代码就是:
- 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插件了!录制一段注册论坛
用户名的脚本,并把其中验证码的输入部分参数化,代码如下:
- Option Explicit
- Dim myCode
- SystemUtil.Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE","","C:\Documents and Settings\Administrator","open"
- Browser("Browser").Page("Page").Sync
- Browser("Browser").Navigate "http://bbs.yuzi.net/CreateUser.asp"
- Browser("Browser").Page("互动交流平台 - Powered By BBSXP").WebEdit("UserName").Set "songfun"
- Browser("Browser").Page("互动交流平台 - Powered By BBSXP").WebEdit("UserEmail").Set "songfun@51testing.com"
- Browser("Browser").Page("互动交流平台 - Powered By BBSXP").WebEdit("VerifyCode").Click
- RunAction "GetChar", oneIteration,myCode
- Browser("Browser").Page("互动交流平台 - Powered By BBSXP").WebEdit("VerifyCode").Set myCode
- Browser("Browser").Page("互动交流平台 - Powered By BBSXP").WebList("PasswordQuestion").Select "最喜欢的老师"
- 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机制存在一个“识别率(也就是正确率)”的概率,我们不能指望依靠它每次都能正确识别出文本。
所以最好的方法,还是让
开发人员把验证码改为万能验证码最好,呵呵!