模型对象及属性

模型管理器中的树形结构中的每个节点都是用于匹配和操作控件的一个自动化对象,该对象通过自身的识别属性匹配被自动化应用中的目标控件,并通过自身的API————对象操作API来操作目标控件。

因此了解对象识别属性有助于我们弄清楚不同情况下该使用哪种识别属性来达到最佳的匹配效果。

注意,这里的对象属性通常只指识别属性,但是你会在模型管理器中的控件操作标签页中看到属性这个字眼。但实际上这些属性的本质都是对象操作API,仅仅是API操作的一种分类,具体的可以查看对象操作API一节。
属性方法

识别属性概述

前面提到了在操作控件时,实际上是调用了模型对象的操作API,接着实例对象根据自身的识别属性去匹配应用中的目标控件。因此,不合理的识别属性可能会导致:

  1. 匹配不到目标控件:提示错误“1003:不能找到这个对象”;
  2. 匹配到多个目标控件:模型管理器右上角提示找到多个控件,左下角列出所有控件的位置信息;

对于前一种情况,在运行中会导致报错,是必须要解决的;而后一种情况,尽量通过设置合理的识别属性来避免。

识别属性的注意点

  • 侦测器识别添加控件时,自动推荐了一些识别属性。将控件的部分属性作为基本的识别属性,比如:typetextclassName等,除了必需的typeclassName识别属性外,生成哪些识别属性取决于目标控件的类型和拥有哪些属性。

  • 识别属性根据控件被添加进模型管理器时的状态创建。因此如果控件某些属性是动态生成的,则不应该将它们作为识别属性。一个针对文本编辑器做自动化时,窗口控件的text属性——在窗口中通常等同于窗口标题,因此这个文本编辑器只要打开了其它的文件,

  • 识别属性运行时属性的关系。

    • 对象有识别属性,从之前的阅读可以了解就是用于匹配控件,是存储在模型文件中,或代码中定义(描述模式)。此外,为了提高识别能力,模型管理器额外提供了一些辅助识别属性,比如indexlevelToParent等。
    • 运行时属性是自动化过程中从控件获取的属性值。而根据不同的控件类型,也提供了不同的API获取这些属性。例如hwnd返回控件窗口的句柄, xy返回控件的所在位置等。
    • 它们两者之间可能有一部分是相同。但运行时属性可能随着时间被应用自身所改变。

首字母大写 or 驼峰式命名:出于可读性上的考虑,在模型管理器中,识别属性采用了首字母大写的命名方式;但在实际代码中,属性名仍然是使用驼峰式命名的,下面的介绍也将采用这种命名,之后会介绍原因。

对象名称与控件名称?

识别属性概述一节可以知道,自动化对象与操作控件的关系更像是一种映射关系。而自动化对象的名称与控件的名称有时候一致有时候又不一致是为什么呢?自动化对象的名称是否可以修改呢?让我们接着往下看。
因为代码中直接操作的是对象,对象名称在获取对象API这篇介绍中也有提及。简单来说,使用getButton("btn1")方法会在模型树中寻找一个对象名称为”btn1“的Button类型自动化对象。
那么如果修改对象名称会带来什么问题?修改控件名称呢?
对象名称是完全可修改的,其默认值通常与控件名称——也就是控件的text识别属性一致(对象名称会用下划线代替空格),修改后调用该对象的代码也需要改成修改后的对象名称。而修改控件名称,由于控件名称是一个识别属性,因此手动修改将会导致找不到控件,因此不建议修改这一属性。

如果控件名称过长,控件名称取值的时候会适当的截断。

标识属性和其它属性?

识别属性标签页中可以看到属性又被分为标识属性其它属性,可以将前者理解为生效的识别属性,后者只显示而不生效,可以使用添加属性按钮添加到标识属性中。

识别属性及分类

在侦测器侦测控件时,会取得控件所有可用的识别属性,并且根据当前控件的属性赋予合适的默认值。在模型管理器中也可以管理控件的的识别属性,还可以手动编辑识别属性的值来更好的匹配控件。

一. 通用识别属性

通用识别属性指的是所有控件都可以有的识别属性,与控件类型无关。

text

控件的名称,取决于以下几个值:

  1. 如果控件在开发时设定了objectName属性,由于该属性的值在应用中唯一,最适合作为识别属性,因此优先选取这个值;
  2. 如果控件在开发时设定了testlabeltitle等属性,由于这些属性与用户看到的控件内容一致,当上一条不满足时选取这个值;
  3. 如果控件没有以上值,则默认没有这一属性。

type

控件的类型,必需的属性,无法更改和删除,影响控件提供的操作API。类型比如Button、Text、Window、List、Table、Tree等等。

className

控件所属的控件类,来自于控件在代码中的类,比如Qt中通常用作窗口的控件是QWidget,那么应用中的窗口的type为Window,className则为QWidget,如下图:

Qt控件的className

由于className的值取决于控件在开发时所采用的具体组件,所以表示的是该控件所使用的Qt组件,也可用于认识应用结构。

boundingRectangle

目标控件的形状信息,由一组长度为4的数组描述,数组中的值代表:[x, y, width, height],其中的xy分别代表控件在桌面坐标系中的横纵坐标,widthheight代表控件的宽度和高度。
boundingRectangle通常用于CukeTest绘制控件的高亮框,由于应用窗口化启动时的大小和位置都不确定,boundingRectangle就会十分不稳定,因此也极少作为识别属性使用。

二. 辅助识别属性

三. 特有识别属性

特有属性是指只存在于某些特定类型控件的识别属性。

itemIndex

目标控件在容器中的索引位置,存在与标签页项TabItem中,指示目标标签页处于第几个索引位置。由于标签页的位置可变,因此这一识别属性通常会配合TabItemtext属性进行匹配,匹配的规则如下:

  • 优先使用text识别属性匹配;
  • text识别属性无法匹配到、或者匹配到多个TabItem控件时,会使用itemIndex属性进行识别;
  • 否则抛出无法找到对象的错误。

itemPath

目标控件在整个视图组件中所处的位置,存在于ListItemTableItemTreeItemViewItem中,但对于不同类型的item中路径的定义也有些许区别。在类型文件中的定义如下:

  1. export type ItemPath = (number | [number, number])[];
  • Table中,ItemPath通常为[num1, num2],代表Table中的第num1行第num2TableItem
  • List中,ItemPath通常为[num1],代表List中的第num1ListItem
  • Tree中,ItemPath通常为[num1, num2, [num3, num4]],代表展开Tree中第num1个节点,接着展开num1节点下的第num2个节点,最后选择第num3个节点的第num4列属性。如果num4为0,则也可以写作[num1, num2, num3]

在代码中使用识别属性

在一些情况下,我们可以跳过模型管理器直接在代码中通过识别属性来取得目标控件,这在很多情况下可以完成更加灵活的自动化,就像Qt的几个演练一样。而使用的就是getControls方法,关于它的用法说明可以点击查看获取对象API