QTP/UFT 中的描述性编程:动态与静态
什么是描述性编程?
描述性编程用于对 AUT 中未存储在对象仓库中的对象执行操作。通过这种机制,您可以绕过对象仓库的识别,直接在语句中提供对象描述。
对象名称仅仅用于将脚本中的对象与其在对象仓库中的描述进行映射。这意味着,如果您更改脚本和对象仓库中的对象名称,脚本应该仍然能够运行。请观看以下视频了解此概念。
如果视频无法访问,请点击此处
视频亮点
- 从对象仓库中删除“代理名称 Win 编辑框”的对象描述。如果您再次运行测试,它将会失败,因为它无法识别该对象。让我们检查一下脚本失败的原因。
- 在运行时,Micro Focus UFT 识别在 WinEdit 框上执行的操作,并且对象仓库中存储的对象描述为“代理名称”。它使用此名称来跟踪对象仓库中的对象。对于一个父级,不能有两个同名的子对象。因此,QTP 唯一地映射了仓库中的对象。然后,它使用对象仓库中存储的描述替换名称。然后它使用此语句来识别被测应用程序中的对象。
- 由于在我们的例子中,我们完全删除了这个对象描述,所以脚本失败了。
- 但是,如果不是 QTP 替换对象描述,而是您作为测试人员直接在脚本中指定对象描述,那会怎么样?这正是“描述性编程”。
描述性编程的类型
您可以通过两种方式使用描述性编程
- 静态
- 动态
静态描述性编程
在静态方法中,为了进行对象识别,您以以下格式指定对象的属性
property:=values,
这种格式称为属性值对,并用引号括起来。
如果您的对象使用多个描述进行识别,您可以使用逗号指定它们。
因此在我们的例子中,“代理名称”的描述变为
"nativeclass:=Edit", "attached text:=Agent Name:"
动态描述性编程
执行相同操作的第二种方法是使用动态描述性编程。
如果您的脚本多次使用描述性编程对象候选,那么为每个语句指定所有属性值对将非常繁琐。
在这种情况下,您可以使用 QTP 提供的描述类。
创建描述对象的语法是
Set MyDescription = Description.Create(); MyDescription("property").Value = "property-value";
这是动态方法
为什么使用描述性编程?
视频文本
- 百万美元的问题是,当对象识别过程由 QTP 处理时,为什么还要使用描述性编程(DP)?
- 假设您被分配测试一个招聘门户。您在门户中输入一个搜索查询,然后
- 您的测试要求您选择所有可用职位并点击申请职位。
- 但显示的职位数量将取决于搜索查询和脚本执行时可用的职位,无法提前预测将显示的职位数量。
- 在这种情况下,您可以使用描述性编程。即使您不知道复选框的数量和名称,您也知道这些对象的类是“WebCheckBox”。
- 您可以使用 ChildObject 方法返回属于特定父级的对象。
- 一行代码,例如:
Set allObjects = Browser("Jobs").Page("QTP").ChildObjects()
- 将返回此页面的所有子对象。
- 但我们只想要 WebCheckBox 对象。为此,我们可以创建一个过滤器创建对象,并将其属性设置为 Web 复选框,然后将此过滤器作为参数传递给 ChildObjects 方法。
- 在这种情况下,只返回了复选框。
- 接下来,您可以编写如下代码,该代码访问从零开始的整个复选框集合,并将所有复选框设置为选中状态。
- 接下来,您可以点击申请按钮以完成测试。
- 您还可以使用描述性编程来运行难以录制的对象,例如自动隐藏面板、具有变化层次结构的对象、嵌套内部对象、子菜单。
- 您还可以使用描述性编程进行高级字符串操作。
- 结合索引属性,描述性编程在识别复杂对象方面非常有用。
- 如果您在对象层次结构中对某个对象使用程序化描述,则需要对后续的子对象使用描述性编程。
- 例如,对于页面对象,使用了描述性编程,但对于后续的子对象 WinEdit,却使用了对象仓库,这是不正确的。
- 相反,这里对 Page 和 WinEdit 都使用了描述性编程,这是正确的。