Descript编程 QTP/UFT动态与静态

⚡ 智能摘要

Descript编程让我…… QTP or UFT 一条语句包含对象描述本身,可以以属性值对的形式,也可以以……的形式。 Descript离子对象,因此即使对象从未存储在对象存储库中,步骤也会运行。

  • 🔘 绕过存储库: 描述信息位于语句内部,因此运行时无需查找对象名称。
  • ☑️ 静态形式: 在测试对象调用中,属性值对以“property:=value”的形式内联写入,并用逗号分隔。
  • 动态表单: Description.Create 构建一个可重用的属性集合,多个语句可以共享该集合。
  • 🧪 专为不可预测的物体而设计: 自动隐藏面板、更改层级结构、嵌套内部对象和大小未知的结果集。
  • 🛠️ ChildObjects 与之配对: A Descript用作过滤器的 ion 对象仅返回与其父对象匹配的子对象。
  • 📌 记住两条规则: 每个属性值都被视为正则表达式,描述完一个父级后,也必须描述它的子级。

静态和动态描述性编程语句 QTP 和 UFT 一个

什么是 Descript编程?

Descript实战编程 用于对 AUT 中定义未存储在其中的对象执行操作。 对象库使用此机制,您可以绕过对象库的标识,直接提供对象。 Descript声明本身中的离子。

对象名称的作用是将脚本中的对象与其在对象库中的描述进行映射。这意味着,如果您同时更改脚本和对象库中的对象名称,脚本仍然应该能够运行。观看以下视频了解此概念。

点击 开始 如果视频无法访问

视频集锦

  • 删除对象 Descript从对象库中删除“代理名称”WinEdit框。如果再次运行测试,则会失败,因为它无法识别该对象。让我们来分析一下脚本失败的原因。
  • 在运行时, UFT 确定对 WinEdit 框执行的操作,以及对象 Descript对象库中的离子存储为代理名称。它使用此名称来 track 对象在对象库中的位置。对于一个父对象,不能有两个同名的子对象,因此 QTP 它唯一地映射存储库中的对象。然后,它使用对象存储库中存储的描述,将名称替换为描述,并使用生成的语句来标识被测应用程序中的对象。
  • 由于我们已完全删除了此对象描述,因此脚本运行失败。
  • 但是,如果不是这样呢? QTP 替换对象描述,即测试人员直接在脚本中指定对象描述?这无异于“Descript实战编程”

下面两种形式实现的就是这种责任的单一变化,每种形式都适用于不同类型的脚本。

有哪些 Descript实战编程

您可以使用 Descript两种编程方式

  1. 静止
  2. 动态

静止 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动态编程绕过了存储库;它并不会提高对象识别率。如果未加载正确的插件,则任何描述都无法使对象被识别。

常见问题

对象间谍 在控件处读取其标识属性,或在运行时调用 GetROProperty 函数。务必完全按照列表​​所示复制名称,并注意对象浏览器会在“类名”标签下显示 micclass。

通常不会。存储库查找只需解析一次存储的描述,而描述的语句每次执行时都会被执行。描述性编程的优势在于能够灵活处理不可预测的对象,而不是单纯追求速度。

建立 Descript在可重用函数内部创建一个离子对象,并将该函数保存在…… VBScript中 与测试关联的函数库。每个加载该库的操作都可以调用它,因此一次修改即可更新所有调用者。

AI 辅助识别通过视觉外观和附近的标签文本来匹配控件,而不是通过固定属性,这样就消除了一些手写描述。 Descript在运行时对物体进行计数或过滤时,仍然需要离子。

副驾驶可以搭建循环框架, Description.Create 会根据描述进行调用和报告,但它无法访问您的应用程序。它建议的每个属性名称和值都必须与实际控件进行验证,然后才能信任该语句。

很少。 共享对象库 这样可以将描述集中在一个可编辑的位置,并保持脚本的可读性。大多数团队会在代码库中保留稳定的屏幕截图,只有在对象是动态变化的时才会参考描述。

先将其简化为单个属性,然后逐个添加其他属性。使用 ChildObjects 过滤器检查对象数量,可以显示描述是否与任何对象都不匹配,或者是否与多个对象存在歧义匹配。

是的。它适用于任何已加载插件的技术,包括标准技术。 Windows,web,.NET, Java 以及终端模拟器对象。只有属性名称不同,因为每个插件都会报告自己的标识属性。

总结一下这篇文章: