最近有一个项目,需要批量生产测试数据。原本打算使用LR来自动生成,但是里面涉及到动态数据的获取,而开发不能及时过来说明该取哪些数据,于是放弃使用LR,而改用QTP进行UI操作的重放来生成数据。
在使用QTP的时候,遇到了诸多问题,类似:
1)在已经录制好的脚本中继续录制操作,存在对象识别的问题;
2)通过判断对象的运行时状态,来控制脚本运行;
3)参数化输入数据,及控制脚本运行次数,错误处理等。
下面归纳下解决上述问题的方法或步骤(下述方法都是针对以默认模式录制的脚本):
1)在录制脚本时,假设某个URL已经关联了某个对象A,如果重新打开该URL并在该脚本中继续录制操作,则QTP则标识该URL对应的web页面为新的ID。
CTRL + R打开对象库,如下图:
可以看到有4个是同一个URL在录制多次时,每次都以新名字被识别,如【网上交易-大智慧股份投资有限公司 -_x】,x从1到4,当x为1时被省略了。
而这时的脚本类似于如下代码:
Browser("网上交易 - 上海大智慧投资咨询有限公司 -").Page("网上交易 - 上海大智慧投资咨询有限公司 -").WebEdit("custId").Set "xxx"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -").Page("网上交易 - 上海大智慧投资咨询有限公司 -").WebEdit("custPassword").SetSecure "xxx"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -").WebEdit("custId").Set "xxx"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -").WebEdit("custPassword").SetSecure "xxx"
从上述代码中可以看到,脚本产生了两个Browser对象。
运行上述代码,可以发现在行:
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -").WebEdit("custId").Set "xxx"
处产生了如下错误:
虽然错误信息显示“无法表示对象custId”,但归根结底,还是因为QTP没有在当前应用程序(IE浏览器)上发现相应的对象【Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2")】的原因。也就是说,当前应用程序上只创建了【Browser("网上交易 - 上海大智慧投资咨询有限公司 -")】对象,并没有创建【Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2")】对象。
解决方法:
设我们维护的QTP对象是a和b,a和b关联的实际上是同一URL页面(例如https://www.gw.com.cn)。对象a中已经录入控件对象1,2,尚未录入对象3和4,但对象b中已经录入控件对象3,4。现在我们就是要把b中录入的对象移入到对象a中。
遵循下述步骤完成对象库维护:
步骤1:找到b中需要移入到a中对象;
步骤2:直接拖入到对象a中。
步骤3:保存脚本,运行看是否已经识别出对象3,4(以不报错为标准)。
2)web页面上在运行时,上面的一些内容(包括文字、连接、图片等)的状态可能会发生改变,这时可以通过判断某些内容的运行时状态来控制脚本的运行。
例如,一个用户在初次登陆 https://fund.wg.com.cn/account/login.jsp后,打开其个人中心,如果该用户是大智慧交易网站的认证直销用户,则会显示一个【认证直销用户】链接:
在QTP脚本中,该对象为:
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_2").Link("认证直销用户")
但是如果用户不是认证直销用户,则在web页面上看不到该连接,也就是说该连接不存在的。在QTP中,就是说这个link的Exist状态为false。
我们可以通过判断该对象是否存在来控制脚本运行路径,代码如下:
If not Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_2").Link("认证直销用户").Exist then
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_2").Link("绑定新的银行卡").Click
Else ' Dim MyVar3 'myvar3 = MsgBox ("Hello World!", 65, "不可绑定")
End If
上述脚本原理是正确的,但是在运行过程中发现,每次运行时,明明对象不存在该link,QTP仍然认为该link存在。
于是将智能识别先设定为disable,问题解决。
Dim App
Set App = CreateObject("QuickTest.Application")
App.Test.Settings.Run.DisableSmartIdentification = True '先禁止智能识别
但是有时如果不对对象进行智能识别,则可能在运行时会报错“找不到对象”。此时把智能识别开启:
App.Test.Settings.Run.DisableSmartIdentification = false '启动智能识别
当然如果需要在整个脚本运行期间启动或禁止智能识别,一是点击菜单【文件】/【设置】打开【测试设置】对话框,在左侧树结构中点击【运行】,取消或勾选复选框【运行会话期间禁用智能标识】,二是像上文所说在脚本开头用脚本语句控制。
总结:何时启动或关闭智能识别,暂时没有找到规律,有知道的朋友知会下,非常感谢。我的个人经验是:通过调试,自己确定应该在合适开启或关闭智能识别。
3)关于参数化、循环次数、错误控制等
我们录制一个QTP脚本,目的肯定不是只为了让脚本运行一次。我们可能想让脚本执行比较简单但步骤繁琐,足以让人觉得厌烦的操作,或者是让脚本自动运行以产生大批量数据。
那么就涉及到参数化了。
如果对QTP的脚本语言(VBS)不是很熟悉,那么就需要打开“关键字视图”,使脚本显示为一种操作序列形式,非常易于理解。点击菜单栏的【视图】/【关键字视图】即可。如下图所示:
图 关键字视图
常量的参数化的操作是这样的:
在关键字视图中,点击值列表中的某个需要参数化的常量,在右键出现的“配置值”按钮(形如<#>)上点击,弹出“值配置选项”对话框,如下:
图 值配置选项
上图中将常量“李四”参数化了,它的参数值类型是Data Table,取当前操作工作表中的p_Text列的值(参数必须和表的列名一致)。
现在我们已经设置好了参数化的配置,接下来就是要将参数文件导入到QTP中。
在QTP的数据表中的数据可以通过在数据表的空白处点击右键,然后导入文件或数据表。选择【文件】->【从文件导入】则可以将数据从文件导入,或者选择【数据表】->【导入】->【从文件】选择参数文件。需要说明的是,在用数据表导入的时候,参数文件中列之间必须以tab分隔,不能使用csv。
其实,在VBS视图中,可以看得更清楚:
Browser("网上交易 - 上海大智慧投资咨询有限公司 -").Page("网上交易 - 上海大智慧投资咨询有限公司 -").WebEdit("custId").Set DataTable("p_tel", dtLocalSheet)
即DataTable("p_tel", dtLocalSheet)替代了原来录制脚本时的常量。
参数化完成后 ,QTP默认循环读取数据表中的数据。我们可以在测试设置中设置循环次数,或者控制运行错误期间发生的错误如何处理。
在上图中,数字2指示的【运行会话期间发生错误】下拉框中包含几个选项“弹出式消息框”、“继续下一操作循环”、“停止运行”、“继续下一步骤”等。我们如果希望脚本在发生错误时依然能执行下一循环,则选择“继续下一操作循环”即可。
另外,根据业务需求,可以修改“对象同步超时”时间,设置适当的话可以节省大量运行时间。
至此,本次测试中的一些关键问题已经解决。脚本也能够正常工作,下面为完整脚本。
'start step1、取参数----------------------------------------------------------
Dim mytel,myid,mybankid
Dim oldtel,oldid,oldbankid
oldtel = DataTable("p_tel", dtLocalSheet)
oldid = DataTable("p_certid", dtLocalSheet)
oldbankid = DataTable("p_bankno", dtLocalSheet)
mytel = Replace(oldtel,"'","")
myid = Replace(oldid,"'","")
mybankid = Replace(oldbankid,"'","")
'end step1、取参数----------------------------------------------------------
'start step2、----------------------------------------------------------
Dim App
Set App = CreateObject("QuickTest.Application")
App.Test.Settings.Run.DisableSmartIdentification = True '先禁止智能识别
'begin关闭所有打开窗口,并打开url:https://fund.wg.com.cn/account/login.jsp
Set ie = Description.Create()
ie("micclass").value = "Browser"
For i = 0 to desktop.ChildObjects(ie).count - 1
desktop.ChildObjects(ie).item(0).close
Next
SystemUtil.Run"C:\Program Files\Internet Explorer\IEXPLORE.EXE","https://fund.wg.com.cn/account/login.jsp"
'end
''end step2、----------------------------------------------------------
'start step3、----------------------------------------------------------
'begin 如果有输入用户名密码框,则输入用户名密码,继续执行;否则用户退出。
If Not Browser("网上交易 - 上海大智慧投资咨询有限公司 -").Page("网上交易 - 上海大智慧投资咨询有限公司 -").WebEdit("custId").Exist Then '没有输入用户名编辑框
If Browser("网上交易 - 上海大智慧投资咨询有限公司 -").Page("网上交易 - 上海大智慧投资咨询有限公司 -").Link("【安全退出】").Exist then
Browser("网上交易 - 上海大智慧投资咨询有限公司 -").Page("网上交易 - 上海大智慧投资咨询有限公司 -").Link("【安全退出】").Click
else
Dim MyVar
myvar = MsgBox ("Hello World!", 65, "没有安全退出按钮")
end if
else '有输入用户名编辑框:可登陆
'Dim MyVar2
'myvar2 = MsgBox ("Hello World!", 65, "有输入用户名编辑框")
Browser("网上交易 - 上海大智慧投资咨询有限公司 -").Page("网上交易 - 上海大智慧投资咨询有限公司 -").WebEdit("custId").Set mytel'DataTable("p_tel", dtLocalSheet)
Browser("网上交易 - 上海大智慧投资咨询有限公司 -").Page("网上交易 - 上海大智慧投资咨询有限公司 -").WebEdit("custPassword").SetSecure "525792d79d8ab2d816cc0261039e2cfc697f"
Set WshShell =createobject("WScript.shell")
WshShell.Sendkeys "{ENTER}"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -").Link("我的账户").Click
'已经进入我的账户
'判断是否有【绑定新的银行卡】连接(link)
' If Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_2").Link("绑定新的银行卡").GetROProperty("visible") Then '可绑定
If not Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_2").Link("认证直销用户").Exist then
'Dim MyVar4
'myvar4= MsgBox ("Hello World!", 65, "可绑定")
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_2").Link("绑定新的银行卡").Click
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebElement("WebElement").Click
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebEdit("userRealName").Set "李四"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebList("gender").Select "男"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebList("vocation").Select "专业技术 "
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebList("identityType").Select "身份证"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebEdit("identityNo").Set myid'DataTable("p_certid", dtLocalSheet)
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebEdit("bankCardNo").Set mybankid'DataTable("p_bankno", dtLocalSheet)
Browser("网上交易 - 上海大智慧投资咨询有限公司 -").Page("网上交易 - 上海大智慧投资咨询有限公司 -_2").WebList("select").Select "上海市 "
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebEdit("addAheadInfo").Set "上海市"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebEdit("zipCode").Set "200200"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebEdit("addEndInfo").Set "杨高南路"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -").Page("网上交易 - 上海大智慧投资咨询有限公司 -_2").WebCheckBox("WebCheckBox").Set "ON"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebEdit("password").SetSecure "52579712499e3140b576ee2c79e18cd6a8a0"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebEdit("WebEdit").SetSecure "525797140404640472cc439e6dbee5623f16"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebCheckBox("WebCheckBox").Set "ON"
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").WebElement("WebElement_2").Click
App.Test.Settings.Run.DisableSmartIdentification = false '启动智能识别
Browser("交易模拟系统").Page("交易模拟系统").WebButton("成功").Click '点击成功按钮
Browser("交易模拟系统").Page("网上交易 - 上海大智慧投资咨询有限公司 -").Link("关闭本页").Click '设置IE每次都打开新窗口解决窗口找不到的错误
Browser("交易模拟系统").Dialog("Windows Internet Explorer").WinButton("是(Y)").Click
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_4").Link("返回首页").Click
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_5").Link("【安全退出】").Click
Browser("网上交易 - 上海大智慧投资咨询有限公司 -_2").Page("网上交易 - 上海大智慧投资咨询有限公司 -_5").Link("5秒后跳转至系统登录界面如果系统没有响应,请点击此链接").Click
Browser("网上交易 - 上海大智慧投资咨询有限公司 -").Page("网上交易 - 上海大智慧投资咨询有限公司 -_3").Link("登录").Click
'else
' Dim MyVar3
'myvar3 = MsgBox ("Hello World!", 65, "不可绑定")
End If
End If
'end
'endstep3、----------------------------------------------------------