💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# QTP / UFT 中的描述性编程:动态&静态 > 原文: [https://www.guru99.com/uft-qtp-descriptive-programming.html](https://www.guru99.com/uft-qtp-descriptive-programming.html) ### 什么是描述性编程? 描述性编程用于在 AUT 中的对象上执行操作,该对象的定义未存储在对象存储库中。 使用这种机制,您可以绕过对象库中的标识,并在语句本身中提供对象描述。 **对象名称仅用于映射脚本中的对象及其在对象库中的描述。** 的含义是,如果您在脚本和对象存储库中更改对象名称,则脚本应运行。 观看以下有关此概念的视频 视频集锦 * 从对象存储库中删除“代理名称赢编辑框”的对象描述。 如果再次运行测试,由于无法识别对象,它将失败。 让我们检查一下脚本失败的原因 * 在运行时,Micro Focus UFT 会识别在 WinEdit 框中执行的操作,并且对象存储库中的对象描述将存储为代理名称。 它使用此名称来跟踪对象存储库中的对象。 对于父对象,不能有两个具有相同名称的子对象。 因此,QTP 唯一地映射存储库中的对象。 然后,它使用对象存储库中存储的描述,并用描述替换名称。 然后,它使用此语句来标识被测应用程序/ li 中的对象> * 由于在本例中,我们已完全删除了该对象描述,因此脚本失败/ li > * 但是,如果您不是测试人员而不是 QTP 替换对象描述,而是直接在脚本中指定对象描述,该怎么办? **这只是“描述性编程”** ## 描述性编程的类型 您可以通过两种方式使用描述性编程 1. 静态的 2. 动态 ### 静态描述性编程 在“静态方法”中,为对象标识,您可以按以下格式指定对象的属性 ``` 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 方法的参数传递 * 在这种情况下,仅返回复选框。 * 接下来,您可以编写这样的代码,该代码访问从零开始的整个复选框集合,并将所有复选框设置为 ON。 * 接下来,您可以单击“应用”按钮完成测试 * **您也可以使用描述性编程来运行难以记录的对象,例如自动隐藏面板,层次结构更改的对象,嵌套的内部对象,子菜单。** * **您也可以使用描述性编程**进行高级字符串操作 * **结合索引属性,描述性编程对于识别困难对象可能非常有用。** * **如果对对象层次结构中的对象使用程序化描述,则需要对后续的子对象使用描述编程。** * 例如对于页面对象,使用了描述性编程,但是对于后续的子对象,则使用了 WinEdit Object Repository,这是不正确的 * 相反,这里对 Page 和 WinEdit 都使用描述性编程,这是正确的