创建虚拟控件

虚拟控件是对界面中某一特定区域进行逻辑定义,使其在自动化测试中可以像普通控件一样进行操作。通过定义虚拟控件,您可以:

  • 精确点击:将界面中的任意图形元素定义成可点击区域。
  • OCR文字识别:对界面区域进行文字识别,获取其中的文本内容,或在其中基于文本进行点击操作。
  • 图像操作:截取虚拟控件对应的区域进行截图、图像对比。
  • 更好的维护性:对于自定义绘制的按钮或特殊界面元素(无法被传统对象识别方法找到的控件),可以使用虚拟控件替代坐标点击,从而提高代码的可读性与适应性。当窗体大小可调整时,虚拟控件也能通过设置“对齐方式”自动适应宽高变化,避免坐标偏移问题。

简言之,虚拟控件通过将界面中的特定区域“封装”成可直接操作的对象,让您的自动化测试更灵活、更可靠、更易维护。

如何定义虚拟控件

在模型管理器中定义虚拟控件主要有两种途径:

  1. 直接在截屏上创建虚拟控件
    在模型管理器中选中某个已识别的控件后,进入控件截屏页的工具栏中选择“创建虚拟控件”,然后在控件截屏区域中拖拽鼠标,即可绘制出一个虚拟控件区域。

  2. 通过虚拟控件高级编辑器批量创建和调整
    点击“编辑虚拟控件”选项,打开虚拟控件编辑窗口。在这里可以一次性添加、修改多个虚拟控件,并为每个虚拟控件设置名称、对齐方式等属性,批量完成更复杂的编辑需求。

示例场景

下图展示了一个名为 appchooser 的 Qt 应用中的图标界面。当用户点击某个图标时,该图标会放大并居中显示。为了实现该界面的自动化操作,我们可以按照以下步骤进行配置:

  1. 识别窗体控件:首先识别整个窗体控件(例如此窗体为Custom类型)。
  2. 编辑虚拟控件:在模型管理器中右击已识别出的窗体对象,选择“编辑虚拟控件”,打开虚拟控件对话框。

    在虚拟控件对话框中,执行以下操作:

    • 添加虚拟控件
      添加四个虚拟控件,分别命名为 CameraGlassBallBook

    • 定义控件区域
      使用鼠标在图像中框选对应图标的区域,确定每个虚拟控件的定位区域。

    • 设置对齐方式
      为每个虚拟控件设置对齐方式。例如,将 Book 控件设置为右下对齐,这样即使窗体大小发生变化,该控件仍能准确定位到右下角的“Book”图标区域。

完成上述设置后,点击“确定”按钮保存虚拟控件配置。返回模型管理器时,可以看到新增的虚拟控件已归属于父控件,并在对象结构中显示。

通过这种方式,我们可以在脚本中直接调用这些虚拟控件,无需重复计算坐标或处理复杂的自定义控件识别。以下是示例代码:

JavaScript
Python
await model.getVirtual("Camera").click();
model.getVirtual("Camera").click()

这样,当脚本执行到上述代码时,系统会自动识别并点击对应的虚拟控件,无需手动干预,简化了自动化操作流程。

虚拟控件的多种使用方式

定义完成虚拟控件后,在编写测试脚本时有多种方式来获取和使用它们。

  1. 从模型中直接获取
    在模型中定义好虚拟控件后,可通过 model.getVirtual("虚拟控件名称") 的方式获取,然后直接调用其方法完成点击、OCR识别、截图等操作。
    详情参考虚拟控件API

  2. 通过描述模式创建
    无需在模型中提前定义,也可以在代码中使用描述式编程的方式,通过指定区域或特征临时创建虚拟控件。
    详情请参考描述模式

  3. 不带参数的 getVirtual() 用法
    调用 getVirtual() 而不传入名称时,会返回一个与父对象控件区域相同大小的虚拟控件对象。这通常用于对整个控件进行图像识别或OCR操作。

    例如,在Win10计算器中获得数字面板的虚拟控件,然后基于OCR来点击数字:

JavaScript
Python
let numPad = model.getGeneric("Number pad").getVirtual();
await numPad.clickVisualText('4');
numPad = model.getGeneric("Number pad").getVirtual()
numPad.clickVisualText('4')

在这里,“Number pad”是计算器的数字面板控件,通过 getVirtual() 获得与其等大区域的虚拟控件,然后 clickVisualText('4') 会对数字“4”进行OCR识别并点击。

注意:针对不同版本的操作系统或应用,控件名称或呈现方式可能不同,需根据实际情况调整。

更多使用细节与API请参考:虚拟控件API

results matching ""

    No results matching ""