Descript编程 QTP/UFT动态与静态
⚡ 智能摘要
Descript编程让我…… QTP or UFT 一条语句包含对象描述本身,可以以属性值对的形式,也可以以……的形式。 Descript离子对象,因此即使对象从未存储在对象存储库中,步骤也会运行。
什么是 Descript编程?
Descript实战编程 用于对 AUT 中定义未存储在其中的对象执行操作。 对象库使用此机制,您可以绕过对象库的标识,直接提供对象。 Descript声明本身中的离子。
对象名称的作用是将脚本中的对象与其在对象库中的描述进行映射。这意味着,如果您同时更改脚本和对象库中的对象名称,脚本仍然应该能够运行。观看以下视频了解此概念。
点击 开始 如果视频无法访问
视频集锦
- 删除对象 Descript从对象库中删除“代理名称”WinEdit框。如果再次运行测试,则会失败,因为它无法识别该对象。让我们来分析一下脚本失败的原因。
- 在运行时, UFT 确定对 WinEdit 框执行的操作,以及对象 Descript对象库中的离子存储为代理名称。它使用此名称来 track 对象在对象库中的位置。对于一个父对象,不能有两个同名的子对象,因此 QTP 它唯一地映射存储库中的对象。然后,它使用对象存储库中存储的描述,将名称替换为描述,并使用生成的语句来标识被测应用程序中的对象。
- 由于我们已完全删除了此对象描述,因此脚本运行失败。
- 但是,如果不是这样呢? QTP 替换对象描述,即测试人员直接在脚本中指定对象描述?这无异于“Descript实战编程”
下面两种形式实现的就是这种责任的单一变化,每种形式都适用于不同类型的脚本。
有哪些 Descript实战编程
您可以使用 Descript两种编程方式
- 静止
- 动态
静止 Descript实战编程
在静态方法中,为了识别对象,可以使用以下格式指定对象的属性
property:=values,
这种格式称为属性值对,并用引号括起来。完整的静态语句如下所示:
TestObject("PropertyName1:=PropertyValue1", "PropertyName2:=PropertyValue2").Method
如果您的对象使用多个描述进行标识,您可以使用逗号来指定这些描述。
因此,在我们的例子中,代理名称的描述变为
"nativeclass:=Edit", "attached text:=Agent Name:"
静态描述会在语句运行时读取,因此非常适合一次性步骤和快速修复不想重新录制的脚本。
动态 Descript实战编程
执行相同操作的第二种方法是使用动态 Descript实战编程
如果你的脚本多次使用描述性编程对象候选,那么为每个语句指定所有属性值对将非常繁琐
在这种情况下,您可以利用 Descript由离子类提供 QTP
创建描述对象的语法是
Set MyDescription = Description.Create() MyDescription("property").Value = "property-value"
这是动态方法
使用上面提到的代理名称属性填充该对象,即可得到一个完整、可重用的描述:
Dim oDesc Set oDesc = Description.Create() oDesc("nativeclass").Value = "Edit" oDesc("attached text").Value = "Agent Name:"
变量 oDesc 现在可以将该对象传递给任何需要该对象的语句,因此一次编辑即可更新使用该对象的每一个步骤。
静态与动态 Descript编程:何时使用每种编程方式
两种形式都会生成相同的运行时描述,因此选择的关键在于维护,而不是功能。
| 标准 | 静态(内联) | 动态的 (Descript离子对象) |
|---|---|---|
| 描述的写作方式 | 在测试对象调用中键入的属性值对 | 添加到使用以下方式创建的对象中的属性 Description.Create() |
| 重用 | 在每个需要该对象的语句中重复出现 | 存储在一个变量中,并传递到任何需要的地方。 |
| 可读性 | 简短的语句易于阅读;冗长的语句则显得笨拙。 | 额外的设置行,但语句本身仍然很短。 |
| 运行时变更 | 除非由变量连接而成,否则值是固定的。 | 每次使用前都可以重新分配属性值。 |
| 可与子对象一起使用 | 不,过滤器参数必须是 a Descript离子物体 | 是的,这是所需的表格。 |
| 最适合 | 对存储库中不存在的对象执行一到两个步骤 | 重复使用的对象,或在运行时检索的集合 |
为何使用 Descript编程?
以下文字稿与视频演示相对应,演示了一个无法预先知道物体数量的真实场景。
视频抄本
- 最关键的问题是:既然对象识别过程已经由……处理,为什么还要使用DP? QTP
- 假设你被安排测试一个求职网站。你在网站上输入搜索查询,测试要求你选择所有可用的职位并点击“申请职位”。
- 但显示的职位数量取决于搜索查询和脚本执行时可用的职位,无法提前预测会显示多少职位。
- 在这种情况下,您可以使用描述性编程。即使您不知道复选框的数量和名称,您也知道对象的类名为“WebCheck”。Box=
- 您可以使用 ChildObjects 方法 返回属于特定父级的对象
- 如下一行代码 –
Set allObjects = Browser("Jobs").Page("QTP").ChildObjects()
返回此页面的所有子对象。
- 但我们只想要 WebCheckBox 为此,我们可以创建一个筛选器对象,并将其属性设置为 Web 复选框类,然后将此筛选器作为参数传递给 ChildObjects 方法。
- 在这种情况下,仅返回复选框。
- 接下来,您可以编写如下代码,该代码从零开始访问所有复选框,并将所有复选框设置为 ON。
- 接下来,您可以点击应用按钮完成测试
- 您还可以使用 Descriptive 编程来运行难以记录的对象,如自动隐藏面板、具有不断变化的层次结构的对象、嵌套的内部对象、子菜单。
- 您还可以使用描述性编程进行高级字符串操作
- 结合索引属性,描述性编程在识别困难对象方面可能非常有用。
- 如果对对象层次结构中的某个对象使用程序化描述,则需要对后续的子对象使用描述性编程。
- 例如,如果 Page 对象使用了描述性编程,但其后续子对象 WinEdit 却来自对象库,则该语句不正确。
- 相反,当 Page 对象和 WinEdit 对象都使用描述性编程时,该说法是正确的。
将转录稿中描述的过滤器和循环写出来,如下所示:
Dim oFilter, allCheckBoxes, i Set oFilter = Description.Create() oFilter("micclass").Value = "WebCheckBox" Set allCheckBoxes = Browser("Jobs").Page("QTP").ChildObjects(oFilter) For i = 0 To allCheckBoxes.Count - 1 allCheckBoxes(i).Set "ON" Next
集合是从零开始的,这就是为什么循环会在某个位置停止。 计数 – 1因为过滤器是在代码行运行时进行评估的,所以无论搜索结果是三个职位还是三十个职位,相同的代码都能正常工作。
正则表达式、序数标识符和常见陷阱
Descript实时编程有两种行为方式,当语句无故失败时,大多数人第一次会感到惊讶。
1)每个属性值都被视为正则表达式。 例如这样的标题 总计(美元) 因此匹配失败,因为括号是正则表达式语法。请使用反斜杠转义括号,或者关闭该属性的正则表达式求值功能。 Descript离子对象:
Set oDesc = Description.Create() oDesc("name").Value = "Total (USD)" oDesc("name").RegularExpression = False
2)序数标识符用于打破平局。 当描述仍然匹配多个对象时,添加 指数, ! or 创建时间 作为一项额外属性。索引计数从零开始:
WebEdit("name:=userName", "html tag:=INPUT", "index:=0").Set "guru99" WebEdit("name:=userName", "html tag:=INPUT", "index:=1").Set "guru99"
在开始调试应用程序之前,还有三个值得检查的陷阱:
- 绝大部分储备使用 麦克风类不是标签 班级名称 显示在对象浏览器 (Object Spy) 中。显示名称不是描述中的有效属性。
- 属性名称不区分大小写,但必须与系统报告的拼写完全一致,包括空格。 附件文本 和 html标签.
- Descript动态编程绕过了存储库;它并不会提高对象识别率。如果未加载正确的插件,则任何描述都无法使对象被识别。
