创建虚拟控件
虚拟控件是对界面中某一特定区域进行逻辑定义,使其在自动化测试中可以像普通控件一样进行操作。通过定义虚拟控件,您可以:
- 精确点击:将界面中的任意图形元素定义成可点击区域。
- OCR文字识别:对界面区域进行文字识别,获取其中的文本内容,或在其中基于文本进行点击操作。
- 图像操作:截取虚拟控件对应的区域进行截图、图像对比。
- 更好的维护性:对于自定义绘制的按钮或特殊界面元素(无法被传统对象识别方法找到的控件),可以使用虚拟控件替代坐标点击,从而提高代码的可读性与适应性。当窗体大小可调整时,虚拟控件也能通过设置“对齐方式”自动适应宽高变化,避免坐标偏移问题。
简言之,虚拟控件通过将界面中的特定区域“封装”成可直接操作的对象,让您的自动化测试更灵活、更可靠、更易维护。
如何定义虚拟控件
在模型管理器中定义虚拟控件主要有两种途径:
直接在截屏上创建虚拟控件
在模型管理器中选中某个已识别的控件后,进入控件截屏页的工具栏中选择“创建虚拟控件”,然后在控件截屏区域中拖拽鼠标,即可绘制出一个虚拟控件区域。通过虚拟控件高级编辑器批量创建和调整
点击“编辑虚拟控件”选项,打开虚拟控件编辑窗口。在这里可以一次性添加、修改多个虚拟控件,并为每个虚拟控件设置名称、对齐方式等属性,批量完成更复杂的编辑需求。
示例场景
下图展示了一个名为 appchooser 的 Qt 应用中的图标界面。当用户点击某个图标时,该图标会放大并居中显示。为了实现该界面的自动化操作,我们可以按照以下步骤进行配置:
- 识别窗体控件:首先识别整个窗体控件(例如此窗体为
Custom
类型)。 编辑虚拟控件:在模型管理器中右击已识别出的窗体对象,选择“编辑虚拟控件”,打开虚拟控件对话框。
在虚拟控件对话框中,执行以下操作:
添加虚拟控件
添加四个虚拟控件,分别命名为Camera
、Glass
、Ball
和Book
。定义控件区域
使用鼠标在图像中框选对应图标的区域,确定每个虚拟控件的定位区域。设置对齐方式
为每个虚拟控件设置对齐方式。例如,将Book
控件设置为右下对齐,这样即使窗体大小发生变化,该控件仍能准确定位到右下角的“Book”图标区域。
完成上述设置后,点击“确定”按钮保存虚拟控件配置。返回模型管理器时,可以看到新增的虚拟控件已归属于父控件,并在对象结构中显示。
通过这种方式,我们可以在脚本中直接调用这些虚拟控件,无需重复计算坐标或处理复杂的自定义控件识别。以下是示例代码:
await model.getVirtual("Camera").click();
model.getVirtual("Camera").click()
这样,当脚本执行到上述代码时,系统会自动识别并点击对应的虚拟控件,无需手动干预,简化了自动化操作流程。
虚拟控件的多种使用方式
定义完成虚拟控件后,在编写测试脚本时有多种方式来获取和使用它们。
从模型中直接获取
在模型中定义好虚拟控件后,可通过model.getVirtual("虚拟控件名称")
的方式获取,然后直接调用其方法完成点击、OCR识别、截图等操作。
详情参考虚拟控件API。通过描述模式创建
无需在模型中提前定义,也可以在代码中使用描述式编程的方式,通过指定区域或特征临时创建虚拟控件。
详情请参考描述模式。不带参数的 getVirtual() 用法
调用getVirtual()
而不传入名称时,会返回一个与父对象控件区域相同大小的虚拟控件对象。这通常用于对整个控件进行图像识别或OCR操作。例如,在Win10计算器中获得数字面板的虚拟控件,然后基于OCR来点击数字:
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。