QTP交流及学习笔记.docx
《QTP交流及学习笔记.docx》由会员分享,可在线阅读,更多相关《QTP交流及学习笔记.docx(23页珍藏版)》请在冰豆网上搜索。
QTP交流及学习笔记
1.对象库及对象识别1
1.1.对象的添加1
1.2.代码中对对象的描述3
1.3.一些对象无法识别情况的处理3
1.3.1.对象不存在3
1.3.2.对象加载超时3
1.3.3.对象的属性值与Run-time对象的属性值不一致4
1.3.4.父对象无法识别4
1.3.5.对象不唯一5
1.3.6.对象item不能识别5
1.3.7.对象item不唯一6
2.描述性编程6
3.QTP学习笔记8
3.1.登录页面验证码的处理8
3.2.日期控件的处理8
3.3.银行密码加密控件的处理8
3.4.随机数的使用9
3.5.四个取/赋值对象属性方法的区别9
3.6.多条数据记录录入的脚本例子10
3.7.QTP取字符串方法11
3.8.QTP调用外部函数的方法12
3.9.数组和ReDim12
3.10.Creationtime属性12
3.11.QTP连接数据库实例13
3.12.DataTable的使用17
3.13.通过字体颜色、字号和type来进行判定17
对象的添加
在菜单中选择Resources\ObjectRepository或者使用快捷键Ctrl+R打开对象库,选择Object\AddObjecttoLocal或者点击
按钮,然后点击需要添加的对象,QTP会自动读取该对象的属性,以便识别。
如下图所示:
可以看到我们添加的是一个WebEdit对象,Browser和Page是它的父对象,当选择非叶子节点进行添加时,可以有选择的添加对象;
TIP:
如果选择叶子节点的对象进行添加时,QTP只会添加识别该对象所必需的父节点,例如我们只添加WebEdit,那么QTP会自动将Browser、Page和两个WebTable添加,并不会添加WebTable或是Page下的其他对象。
另外,QTP在录制脚本时,会将脚本涉及到的对象,自动添加到对象库中,但是自动添加的对象属性并不是每次都能识别,而且QTP会自动添加一堆没用的对象,所以不建议使用录制的方式进行脚本的编写
1.1.代码中对对象的描述
以下是在QTP脚本中对对象及对象方法及参数的描述规则;(以下代码为在SP门户下输入用户名“00000001”,输入密码,输入验证码“YXWB”,点击登录按钮)
Browser("中国航信综合业务分销平台").Page("中国航信综合业务分销平台").WebEdit("txtUserName").Set"00000001"
Browser("中国航信综合业务分销平台").Page("中国航信综合业务分销平台").WebEdit("txtSPPwd").SetSecure"4bbbe9103f28526cf3d6252a25dbeb0ad8bd"
Browser("中国航信综合业务分销平台").Page("中国航信综合业务分销平台").WebEdit("validator").Set"YXWB"
Browser("中国航信综合业务分销平台").Page("中国航信综合业务分销平台").Image("imgLogin").Click30,11
1.2.一些对象无法识别情况的处理
一般来说,对象无法识别分为以下几种情况
1.2.1.对象不存在
如果对象已经不再在被测程序中存在,则应在脚本中修改或删除相关步骤。
1.2.2.对象加载超时
1、对于Web对象,增加BrowserNavigationTimeout(File>Setting>Web页签)时间。
2、在包括该对象的步骤前使用Wait语句,让QTP在执行该步骤之前等待一段时间。
1.2.3.对象的属性值与Run-time对象的属性值不一致
根据以下的步骤比较测试对象与Run-time对象的属性值:
1、进入ObecjtRepository窗口(Resources>ObjectRepository),选择对象。
2、记录对象的class以及它的各个属性及属性值。
3、打开被测程序,并打开包含被测对象的页面或窗口。
4、在QTP中选择菜单Tools>ObjectSpy或点击ObjectSpy按钮,打开ObjectSpy对话框。
5、选择“TestObjectProperties”选项。
6、点击右上角的按钮(带有手图标的),这时QTP窗口以及ObjectSpy对话框都被最小化。
7、在程序页面(或窗口)中点击目标对象,恢复ObjectSpy对话框,并在对话框中显示对象及其父对象(以树的形式显示),并在Properties页签中显示当前对象的属性及属性值。
8、这时ObjectSpy对话框的Properties页签中显示Run-time对象的所有属性,在此查看对象的class,以及它的属性及属性值,并将它与第2步中记下的内容进行比较。
1.2.4.父对象无法识别
对象的识别还与它所继承的父对象有关。
如果你能在被测程序中看到对象,而且程序中对象的属性值与仓库中对象的属性值也是一致的,但仍然遭遇到了“Cannotidentifyobject”错误,则这个错误可能与它的父对象有关(如仓库中父对象的属性值与程序中父对象的属性值不一致),也可能是仓库中的对象与程序中对象的继承关系不相同导致的。
要判断是继承关系中的哪个父对象出现了问题,请尝试下面的方法之一:
1、重新录制对象,比较新旧对象的父对象。
2、对继承关系中的每个父对象,分别插入一个Exist语句,并运行该部分脚本。
一旦找到了存在问题的父对象,接下来偿试以下方法:
1、修复存在问题的父对象的描述。
方法见1.4。
2、在专家视图的模式下,查找所有继承存在问题的实例并进行修正
1.2.5.对象不唯一
查看当前对象的描述,并尝试在程序中找到其它具有相同描述的对象并查看它们的描述。
1、如果你找到了可以将它们区别开来的一个或多个属性,则修改仓库中对象的相关属性(如向描述中添加属性等),以使QTP在运行时可以唯一识别它。
2、如果它们的识别属性完全相同,则在对象描述中为对象添加一个ordinalidentifier(index或location)。
1.2.6.对象item不能识别
QTP不能识别方法参数中指定的列表或树对象的item时,请确认指定的item是否存在于对象之中。
1、如果item不存在,则删除相关脚本步骤,或修改item。
2、如果item存在,但被测程序中它的名字发生了改变,则修改item的名称,或在脚本中使用item的index而不是名字(如“#4”)。
注意,不同的对象或方法,它们使用index的语法可能不同。
1.2.7.对象item不唯一
在列表或树对象中,可能有多个名字相同的item。
在这种情况下,可以指定item使用index(例如“#4”)。
2.描述性编程
QTP的对象库使得自动化测试脚本变的更加简单,当然依赖性也更强,在实际工作中,对象的属性不会是一成不变的,版本的变更、缺陷的修改、需求的变更,都会导致对象相应的属性变更,如果脚本过分依赖对象库,当被测试系统比较庞大时,对象库的维护工作将变得非常困难,脚本移植性也会变的很差。
其实,在QTP脚本中,不使用对象库或对象名称,也可以对被测程序中的对象进行操作。
为了做到这一点,我们需要在QTP脚本中提供对象的属性及其值的列表。
这就是编程性描述。
当对象不存在于对象仓库之中,而我们又希望操作该对象时,编程性描述就非常有用。
如果有多个对象,它们具有某些相同的属性,通过编程性描述,我们可以在这些对象上进行相同的操作;或者某个对象的属性无法确定,需要在运行过程中指定,我们也可以使用编程性描述,来对该对象进行操作。
编程性描述的方法有两种:
方法一:
在语句中直接列出对象的属性及值的列表;
方法二:
使用Description对象,为Description对象添加属性及值的集合,然后在语句中直接使用Description对象的名称即可。
使用第一种方法要简单一些,但是在很多情况下,第二种方法更显得功能强大并更有效率。
通常语法如下:
TestObject(“PropertyName1:
=PropertyValue1”,“…”,“PropertyNameX:
=PropertyValueX”)
TestObject:
指的是测试对象的类名
PropertyName:
=PropertyValue:
指的是测试对象的属性及值。
每对property:
=value用双引号标记,并用逗号隔开。
例如:
Browser("中国航信综合业务分销平台").Page("中国航信综合业务分销平台").WebEdit("htmlid:
=txtUserName").Set"00000001"
这里我们用了htmlid作为描述WebEdit的属性,QTP会先找到WebEdit对象,然后匹配htmlid属性是txtUserName的WebEdit来进行.set的操作。
如果需要描述属性的对象比较多或者有单个对象要多次使用,结合方法二我们可以把脚本修改为这样
SetDescBrowser=Description.Create()
DescBrowser("name").value="中国航信综合业务分销平台"
SetDescPage=Description.Create()
DescPage("title").value="中国航信综合业务分销平台"
WithBrowser(DescBrowser).Page(DescPage)
.WebEdit("htmlid:
=txtUserName").Set"00000001"
.WebEdit("htmlid:
=txtSPPwd").Set"111111"
.WebEdit("htmlid:
=validator").Set“YXWB”
.Image("htmlid:
=imgLogin").Click
EndWith
如果页面中存在多个name是txtUserName的WebEdit,可以在描述性脚本中增加index属性对对象进行描述,例如
WithBrowser(DescBrowser).Page(DescPage)
.WebEdit("htmlid:
=txtUserName",”index:
=0”).Set"00000001"
.WebEdit("htmlid:
=txtUserName",”index:
=1”).Set"00000002"
.WebEdit("htmlid:
=txtUserName",”index:
=2”).Set"00000003"
EndWith
3.QTP学习笔记
3.1.登录页面验证码的处理
登录页面的验证码是Image对象,没办法通过GetROProperty方法取出验证码,目前没有很好的解决方法,只能通过增加一个输入参数的方式去跳过验证,实例代码如下:
Input=Inputbox("输入验证码")
Browser(DescBrowser).Page(DescPage).WebEdit("htmlid:
=validator").Setinput
3.2.日期控件的处理
多数日期控件都很难被QTP识别,而且识别了也很难按照要求去选择日期,针对日期控件,可以使用.Object.setAttribute方法直接写入“value”值,跳过日期控件,实例代码如下:
Browser(DescBrowser).Page(DescPage).WebEdit("htmlid:
=txtGoDate").Object.setAttribute"value",date
注:
其中date是QTP的日期函数,返回当前系统日期
一站式中的日期控件格式与date返回格式不符,可使用以下函数对日期格式进行再处理
PublicfunctionDateConvert(iStr)
DimDateArray
DateArray=split(iStr,"-")
Forj=0toUbound(DateArray)
Iflen(DateArray(j))<=1then
DateArray(j)="0"&DateArray(j)
endif
Next
iStr=DateArray(0)&"-"&DateArray
(1)&"-"&DateArray
(2)
DateConvert=iStr
EndFunction
3.3.银行密码加密控件的处理
银行相关的密码控件是加密过的,就算识别成WebEdit也无法使用set方法,航信的系统自动设别时将之识别成WebEdit,后来单独识别又识别成了WinObject,这里的解决方法不推荐使用虚拟对象,直接用WinObject的type方法录入数据即可,实例代码如下:
Browser(DescBrowser).Page(DescPage).WinObject("ATL:
Edit").Type"123456"
3.4.随机数的使用
在测试脚本的编写过程中,经常会经常将一些参数随机化,来增加自动化测试脚本的范围和功效,QTP中的随机函数语法如下
RandomNumber(ParameterNameOrStartNumber[,EndNumber])
适用于随机化的一些情况:
1、ComboBox和CheckBox的index
2、查询结果的页码
3、WebTable的row
4、一些int值
5、一些按钮的index值或者可供随机化的属性值,例如:
Browser(DescBrowser).Page("title:
=航旅天空-AG门户-航班查询结果").image("htmlid:
=iBBB_Flight"&intFlight&"Cabin"&RandomNumber(1,intCabin)).Click
6、利用ASCII码实现字符串的随机化
3.5.四个取/赋值对象属性方法的区别
其实一共有四个相似的方法,分别是:
GetTOPropertys,SetTOProperty,GetTOProperty,GetROProperty
前三者之间的区分还是比较好理解的,主要是最后面两个之间的区分,
1、GetTOProperty是得到现对象库中的已经存在对象的属性值,这个值早就在添加对象的时候就已经定死了,所以对于随着情况不同而会随时改变的属性值,那么就需要用到GetROProperty
2、GetROProperty是得到运行时对象的属性值,如edit控件中的值会随着其它的参数改变而改变,那么这个时候用GetTOProperty来得到对象的中的属性值就不合适了
3.6.多条数据记录录入的脚本例子
一站式旅客信息输入实例
'************************************************************
'变量说明
'PsgNum:
旅客人数
'i:
循环变量
'PsgName:
旅客名字,一维数组
'PsgCode:
旅客证件号码,一维数组
'************************************************************
DimPsgNum,i,PsgName,PsgCode
PsgName=array("aaa/aaa","bbb/bbb","ccc/ccc","ddd/ddd","eee/eee","fff/fff","ggg/ggg","hhh/hhh","iii/iii")'旅客名
PsgCode=array("111111","222222","333333","444444","555555","666666","777777","888888","999999")'旅客证件号码
PsgNum=RandomNumber.Value(1,9)
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebList("htmlid:
=dropPsgNum").SelectPsgNum-1
'循环:
输入旅客信息
Fori=1toPsgNum
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").Webedit("name:
=txtPsgName"&i).SetPsgName(i-1)
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebList("name:
=selPsgIDType"&i).Select"其它"
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").Webedit("name:
=txtPsgIDNo"&i).SetPsgCode(i-1)
Next
IfBrowser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebButton("htmlid:
=btnNext").GetROProperty("disabled")=1Then
Reporter.ReportEventmicFail,"【确定】按钮异常,脚本终止","系统提示错误:
”"&Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebElement("htmlid:
=lblEx").GetROProperty("innertext")&"“"
ExitRun
Else
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebRadioGroup("name:
=radReceiptDeliveryType").Select"#"&RandomNumber.Value(0,3)
IfInt(Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebRadioGroup("name:
=radReceiptDeliveryType").GetROProperty("value"))=0Then
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebButton("htmlid:
=btnNext").Click
elseifInt(Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebRadioGroup("name:
=radReceiptDeliveryType").GetROProperty("value"))=3then
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebEdit("htmlid:
=ReceiptDelivery1_txtReceiptDeliveryName").Set"Tester"
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebEdit("htmlid:
=ReceiptDelivery1_txtReceiptDeliveryAddress").Set"ThisisaQTPScript"
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebEdit("htmlid:
=ReceiptDelivery1_txtReceiptDeliveryPhone").SetRandomNumber.Value(10000000,99999999)
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebEdit("htmlid:
=ReceiptDelivery1_txtReceiptDeliveryRequireSendTime").Object.setAttribute"value",DateConvert(Cstr(date))
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebButton("htmlid:
=btnNext").Click
elseifInt(Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebRadioGroup("name:
=radReceiptDeliveryType").GetROProperty("value"))=1then
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebRadioGroup("name:
=radReceiptDeliveryType").Select"#0"
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebButton("htmlid:
=btnNext").Click
else
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebEdit("htmlid:
=ReceiptDelivery1_txtReceiptDeliveryName").Set"Tester"
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebEdit("htmlid:
=ReceiptDelivery1_txtReceiptDeliveryPostCode").SetRandomNumber.Value(100000,999999)
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebEdit("htmlid:
=ReceiptDelivery1_txtReceiptDeliveryAddress").Set"ThisisaQTPScript"
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebEdit("htmlid:
=ReceiptDelivery1_txtReceiptDeliveryPhone").SetRandomNumber.Value(10000000,99999999)
Browser("航旅天空-AG门户-旅客信息输入").Page("航旅天空-AG门户-旅客信息输入").WebButton("htmlid:
=btnNext").Click
EndIf
EndIf
3.7.QTP取字符串方法
1、instr方法
InStr([start,]string1,string2[,compare])
这个函数需要的的参数是起始位置、主体字符串、要查找的字符串;Compare是可选参数。
指定字符串比较。
此compare参数是可以省略的,也可以是0,1或2。
指定0(