QTP描述性编程

6 篇文章 0 订阅

使用编程性描述(Using Programmatic Descrīptions

在录制脚本时,QTP会将被测对象添加到对象仓库中。只要对象存在于仓库中,我们就可以在专家视图中使用该对象进行手动添加脚本。在脚本中,我们一般都使用对象的名称(该对象名称不区分大小写)作为对象描述。

例如:

在下面的语句中“username”是一个编辑框的名称。这个编辑框位于某页面(Page)之上(该页面的名称为“ToursMercury”),并且该页面属于名为“Mercury Tours”的浏览器(browser)。

Browser("Mercury Tours").Page("Mercury Tours").WebEdit("username")

因为对象仓库中的对象的名称是唯一的,因此你只要在脚本中指定对象的名称即可。QTP根据指定的对象名称以及它的父对象在对象仓库中找到该对象,然后根据仓库中对象的详细描述从被测试程序中查找并识别对象。

其实,在QTP脚本中,不使用对象仓库或对象名称,也可以对被测程序中的对象进行操作。为了做到这一点,我们需要在QTP脚本中提供对象的属性及其值的列表。这就是编程性描述。

当对象不存在于对象仓库之中,而我们又希望操作该对象时,编程性描述就非常有用。如果有多个对象,它们具有某些相同的属性,通过编程性描述,我们可以在这些对象上进行相同的操作;或者某个对象的属性无法确定,需要在运行过程中指定,我们也可以使用编程性描述,来对该对象进行操作。

例如:在一个页面有多个check box,你不能预知其个数,也不知道所有check box的准确描述,然而你希望选中所有的check box。在这种情况下,你可以使用编程性描述来解决。你只需要让QTP对所有描述为HTML TAG=input,TYPE=check box的对象执行一个Set “ON”的操作即可。

编程性描述的方法有两种:

方法一:在语句中直接列出对象的属性及值的列表;

方法二:使用Descrīption对象,为Descrīption对象添加属性及值的集合,然后在语句中直接使用Descrīption对象的名称即可。

使用第一种方法要简单一些,但是在很多情况下,第二种方法更显得功能强大并更有效率。

在语句中直接使用编程描述(Entering Programmatic Descrīptions Directly into Statements

在语句中不使用对象的名称,而是使用对象的描述(指定多对property:=value值)。

通常语法如下:

TestObject(“PropertyName1:=PropertyValue1”,”,“PropertyNameX:=PropertyValueX)

TestObject:指的是测试对象的类名

PropertyName:=PropertyValue:指的是测试对象的属性及值。每对property:=value用双引号标记,并用逗号隔开。

注:property value可以是变量。

注意:在编程性描述中,QTP将所有的property value视为正则表达式。因此,当property value中包括正则表达式特殊字符(如*,?,+)时,要在特殊字符前加“/”

下面的语句中,使用到了Mercury Tours网页中的一个WebEdit对象,它的NameAuthorIndex3。在运行过程中,QTP就会从网页中查找NameAuthor并且Index3WebEdit对象,并在WebEdit中输入文字“MarkTwain”。

Browser("Mercury Tours").Page("Mercury Tours").WebEdit("Name:=Author", "Index:=3").Set "Mark Twain"

注意:如果你对测试对象层级关系中的某个上级对象使用了编程性描述,那么在同一语句中,从该对象开始,它的所有下级对象都必须使用编程性描述,否则QTP不能识别该父级对象的下级对象。

例如:语句中,层级关系中所有的对象都使用了编程性描述:

Browser("Title:=Mercury Tours").Page("Title:=Mercury Tours").WebEdit("Name:=Author", "Index:=3").Set "Mark Twain"

下面的语句中,从层级关系中的某个点开始,使用编程性描述(从Page对象开始):

Browser("Mercury Tours").Page("Title:=Mercury Tours").WebEdit("Name:=Author", "Index:=3").Set "Mark Twain"

但是,你不能象下面的语句这样使用编程性描述。(它对BrowserPage对象使用了编程性描述,但是对于WebEdit对象,却又想使用对象仓库中的名称)

Browser("Title:=Mercury Tours").Page("Title:=Mercury Tours").WebEdit("Author").Set "Mark Twain"

QTP偿试根据WebEdit的名称在仓库中定位对象,但是却无法在仓库中找到它的父对象。

For more information on working withtestobjects, seeWorking with Test Objects.

如果在脚本中你要多次使用到相同的编程性描述,可以将对象指定到变量。

例如,有如下脚本:

Window("Text:=Myfile.txt - Notepad").Move 50, 50

Window("Text:=Myfile.txt - Notepad").WinEdit("AttachedText:=Find what:").Set "hello"

Window("Text:=Myfile.txt - Notepad").WinButton("Caption:=Find next").Click

你可以将脚本改进为:

Set MyWin = Window("Text:=Myfile.txt - Notepad")

MyWin.Move 50, 50

MyWin.WinEdit("AttachedText:=Find what:").Set "hello"

MyWin.WinButton("Caption:=Find next").Click

你还可以使用With语句,将脚本改进为:

With Window("Text:=Myfile.txt - Notepad")

       .Move 50, 50

       .WinEdit("AttachedText:=Find what:").Set "hello"

       .WinButton("Caption:=Find next").Click

End With

For more information about theWithstatement, seeWith Statement.

在编程性描述中使用Descrīption对象(Using Descrīption Objects for Programmatic Descrīptions

你可以使用Descrīption对象,来返回一个Properties collection对象,该集合对象包括一系列Property对象。每个Property对象由Property namevalue组成。

然后在语句中用Properties collection对象替代被测对象的名称。

注意:默认情况下,所有被添加到Properties collection中的Property对象的值被当成正则表达式对待。因此,当Property Value中包含正则表达式的特殊字符(如*?+)时,要在特殊字符前使用“/”符号。

你也可以在Properties Collection中,将RegularExpression属性值设置为False,这样即使在Property Value中用到了正则表达式的特殊字符,也会被视为普通字符。更多信息参考QuickTest Professional Object Model ReferenceUtility部分。

要创建Properties collection,使用Dexcription Create语句,语法如下:

SetMyDescrīption= Descrīption.Create()

一旦创建了Properties对象(例如上例中的Mydescrīption,在运行过程中,你就可以使用语句向Properties对象添加、编辑、移除或获取属性及属性值。这使你在运行过程中可以动态的决定:在对象描述中使用哪些属性、使用多少属性。

当你将一系列的属性及属性值加入到Properties collection中以后,你就可以在脚本语句中用Properties对象替代被测对象的名称。

例如,有如下语句:

Window("Error").WinButton("text:=OK", "width:=50").Click

通过改造,成为:

Set MyDescrīption = Descrīption.Create()
MyDescrīption("text").Value = "OK"
MyDescrīption("width").Value = 50
Window("Error").WinButton(MyDescrīption).Click

注:当为一个ActiveX对象创建编程性描述时,如果该对象的run-time对象是windowless的(即没有相应的window handel),就必须在属性描述中将它的windowless property设置为Ture

例如:

Set ButDesc = Descrīption.Create
ButDesc("ProgId").Value = "Forms.CommandButton.1"
ButDesc("Caption").Value = "OK"
ButDesc("Windowless").Value = True
Window("Form1").AcxButton(ButDesc).Click

 

获取Child ObjectsRetrieving Child Objects

通过ChildObjects方法,可以获取指定对象下的所有子对象,或只获取那些符合编程性描述的子对象。为了获取某对象的子对象的子集,首先需创建一个descrīption对象,然后在该对象的descrīptions collection中添加一系列的属性及属性值,这些属性及属性值必须符合子集的要求。

注意:你必须使用Descrīption对象来为ChildObjects描述参数 创建编程性描述,不能使用property:=value语法直接将编程性描述添加到参数中。

一旦你已经在descrīption对象中“built”了描述,就可以使用下面的语法来获取与描述匹配的子对象:

SetMySubSet=TestObject.ChildObjects(MyDescrīption)

例如:下面的语句使QTP选中网页中的所有选择框:

Set MyDescrīption = Descrīption.Create()

MyDescrīption("html tag").Value = "INPUT"

MyDescrīption("type").Value = "checkbox"

Set Checkboxes = Browser("Itinerary").Page("Itinerary").ChildObjects(MyDescrīption)

NoOfChildObjs = Checkboxes.Count

For Counter=0 to NoOfChildObjs-1

       Checkboxes(Counter).Set "ON"

Next

For more information about theChildObjectsmethod, refer to theQuickTest Professional Object Model Reference.

WebElement对象使用编程性描述(Using Programmatic Descrīptions for the WebElement Object

如果没有录制WebElement对象,也可以使用编程性描述,来对Web网站中的任何一个WebElement对象进行操作。

例如:

Browser("Mercury Tours").Page("Mercury Tours").WebElement("Name:=UserName", "Index:=0").Click

set WebObjDesc = Descrīption.Create()

WebObjDesc("Name").Value = "UserName"

WebObjDesc("Index").Value = "0"

Browser("Mercury Tours").Page("Mercury Tours").WebElement(WebObjDesc).Click

QuickTest clicks on the first Web object in the Mercury Tours page with the nameUserName.

关于WebElement对象的更多信息,参考QuickTest Professional Object Model Reference

在编程性描述中使用Index属性(Using the Index Property in Programmatic Descrīptions

在需要唯一识别一个对象时,index属性有时候可能非常有用。index属性是对象在源代码中出现的顺序,第1次出现时,index值为0

Index属性是object-specific的。因此,当你用index属性值“3”来描述一个WebEdit对象时,QTP会在被测程序的当前页面中查找第4WebEdit对象。

如果你使用index属性值3来描述一个WebElement对象时,QTP会在被测程序的当前页面中查找第4Web对象。

例如,当前页面中存在下面的对象:

  • 一个名为QppleImage对象
  • 一个名为UserNameImage对象
  • 一个名为UserNameWebEdit对象
  • 一个名为PasswordImage对象
  • 一个名为PasswordWebEdit对象

下面的语句中指的是列表中的第3个对象,因为它要求指向的是第1个名为UserNameWebEdit对象。

WebEdit("Name:=UserName", "Index:=0")

 

下面的语句中指的是列表中的第2个对象,因为它要求指向的是第1个名为UserNameWebElement对象。

WebElement("Name:=UserName", "Index:=0")

注:如果当前只有一个对象,使用index=0将无法查找到对象,因此就不能在对象描述中使用index属性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
自动化功能测试是一种企业级的用于检验应用程序是否如期运行的功能性测试工具。1. QTP描述性编程 8 2. 描述性编程2 15 3. 函数 17 3.1. QTP中几个截取字符串的函数 18 4. "+" "&"的区别 20 5. QTP场景恢复 21 6. QTP中测试环境的初始化 27 7. QTP将数据库中的数据导入到excel 29 8. 在QTP中将数据库的数据导入到EXCEL 29 9. QTP将数据测试驱动 31 10. QTP中设置共享对象库 32 11. QTP ActiveX 报错; 35 12. 数据驱动在测试中的应用 35 13. 在Excel中增加超链接的方式 39 14. 登陆脚本设计 40 15. QTP中Wait与同步点的区别 41 16. QTP tips 41 17. Action 调用 45 18. Action 参数调用 47 19. QTP中根据日期计算年龄的解决办法 48 20. 测试报告知多少 48 21. 调用共享文件 49 22. 识别grid中的button 52 23. How to parameterize your link 52 24. QTP中的步骤生成器 54 25. QTP感想 56 26. QTP 参数化实例 60 27. 对象库的管理与合并 62 28. QTP中虚拟对象设置 66 29. QTP删除新建文本文件没有权限的问题 68 30. 关于Filter如何使用的疑问 69 31. Call Windows API 69 32. Global 和local区别 72 33. QTP itself API 73 34. QTP需探讨的问题 74 在我的文章中也提到过了,描述性编程能让QTP脱离对象库来执行脚本.在某些特殊应用的时候,可能就更方便点.比如:要针对某个对象的参数化等等.而且描述性脚本因为脱离了对象库,所以增加了脚本的可移植性.同时脚本也更具有可读性.当然也给手工写脚本提供了一个平台. 74 35. 正则表达式的应用 75 36. 数据驱动测试: EXCEL 81 37. Action parameters 92 38. 数据驱动测试:文件 95 39. 相对路径action path 101 40. 两种方法参数化link 101 41. WScript 102 42. QTP Plus 的应用 109 43. 一个万能的键盘模拟函数 110 44. XML参数化 115 45. Oracle QTP 115 46. 对象库的管理与合并 116 47. change sysdate 120 48. Import Excel 120 49. Call Dll 121 50. Call Function 123 51. Global and local 区别 124 52. Shell 124 53. 对文件系统操作 125 54. 对象同步 125 55. 正则表达式应用模板 125 56. Wscript.shell 的应用 126 57. Create log file 126 58. 对象同步 127 59. 异常控制 127 60. Check if the object.exist 128 61. QTP场景恢复 129 62. QTP步骤生成器 135 63. IFRAME issues 138 64. Iframe issues 续 142 65. QTP解析PDF 144 66. QTP常见问题解答一 144 67. QTP常见问题解答二 146 68. QTP常见问题解答三 149 69. QTP常见问题解答四 150 70. QTP设计开发脚本 151 71. 设置共享对象库 152 72. 检查网页上文字显示的颜色 155 73. QTP录制如何识别编辑框 156 74. How to search the string from the html source 157 75. ADORecord.set操作 159 76. Object Property参数化操作 161 77. Quick Test Plus 工具 163 78. Schedule the QTP tasks 164 79. General the radom code 165 80. ChildObjects和webTable的使用 166 81. 怎样在QTP中打开右键菜单 167 82. CaptureBitmap方法 169 83. 校验对象是否存在object.exist 170 84. QTP中&和_的用法。 171 85. 选取webList中某一项 172 86. object.SetCaretPos方法 172 87. Similar to watir sample using description programming 173 88. QTP使用outlook发邮件 173
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值