BizSpy控件识别工具
BizSpy软件工具用于辅助自动化执行程序开发人员对各种控件进行识别,自动生成控件识别路径,可以对路径进行反复测试,直至找到最稳定的识别方式。与市面上流行的Spy类软件不同,本软件可以让使用者调整显示方式,以顶层窗口为单位对内部的控件进行详细的分析,从而减少对系统资源的消耗,其运行十分平稳。针对一些临时出现的控件,本系统提供缓存的方式进行跟踪,可以让用户利用缓存下来的信息分析控件特征,在测试的时候,可以指定在约定时间后进行寻找,以便用户准备好该控件的出现的条件。 BizSpy除提供丰富的控件识别功能外,还可以对控件执行简单的操作,包括获取成批的控件信息,便于用户执行批量操作。
BizPath 控件路径的识别方式
控件(Control)指的就是Windows界面上的元素,如一个窗口,一个按钮,一个下拉菜单都是一个控件,控件可以包含子控件,如一个窗口包含有菜单条控件、按钮控件、编辑框控件,菜单条控件又包含各个菜单项控件,因此一个窗口的控件可以组织成一棵树,树根为顶层窗口,然后逐步细化,这样出现了控件的儿子,控件的孙子以及控件的后代这些概念。
BizPath定义了如何在一颗树中找到符合要求的控件,从起始位置开始,按照寻找的条件在指定的寻找范围中一遍一遍往下找,每一遍找到的控件元素作为下一遍寻找的起始元素,如果某一遍找到了多个元素,则依次将每个元素作为起始元素往下找。
寻找的起始位置
起始位置可以为树的根节点,也可以是某个指定的节点,也可以是与当前元素相关的节点,如下表所示
起始位置说明 | BizPath示例 | 说明 |
---|---|---|
从树的根节点开始寻找 | /window [@classname="notepad"] | 寻找类名为notepad的顶层窗口 |
从当前元素的节点开始寻找 | ./button [@name="OK"] | 寻找当前元素下面名称为OK的按钮 |
从当前元素的兄弟开始 | ../button [@name="Cancel"] | 当前元素为OK按钮,找到旁边的Cancel按钮 |
从变量代表的元素开始 | $1/menuitem [@name="Open"] | $1代表的是“File”菜单项,寻找下面的Open子菜单项 |
从当前窗口开始 | //menu [@name="File"] | 连续两个斜杠表示从当前窗口开始寻找 |
寻找的范围
每一遍寻找的时候,依据以斜杠'/'开头的说明定义寻找的范围:如果只有一个斜杠‘/’,则表示在儿子中寻找;如果中间夹了一个问号(如“/?/”),则表示在所有孙子中找;如果是连续两个斜杠“//”,则表示在所有后代中寻找。
注意:在从起始位置开始寻找的时候,默认为是寻找儿子,如果在/后面再加上?/则为寻找孙子,再加上/则为寻找后代。例如://?/... 意味着从当前窗口中寻找孙子;///... 意味着从当前窗口中寻找后代; ./?/意味着从当前控件元素中寻找孙子;.//... 意味着从当前控件元素中寻找后代 。
注意:如果是从根节点往下寻找(也就是说,起始节点为根节点),则首先一定是寻找顶层窗口,而且只寻找一个,不允许从根节点寻找孙子或后代。
寻找的条件
每一遍的寻找动作为:依据约束条件在寻找的范围中找到符号条件的控件元素集合,FWScript提供多种方式定义寻找的约束条件,如下表所示:
条件定义方式 | BizPath示例 | 说明 |
---|---|---|
类似于XPath的传统方式 | ....../button [@classname="myitem" and @id="item2'] | 紧跟斜杠'/'之后的button指定要寻找的控件类型的名称,在window系统中,一共有约40种控件类型,有固定的控件名称;在方括号'[' ']'之间指定对控件的属性(Property)的约束,可以使用and,or 与 !逻辑运算符,也可以使用圆括号'(' ')'进行复杂的组合,约束条件使用等于(=)或不等于(!=)。在window系统中注意属性名称都是固定的关键字,有些属性名称属于所有控件类型都共有的,而有些属性名称只是属于某些特定的控件类型。在FWScript中,为了开发者的便利,针对控件名称与属性名称定义了一些别名,如使用id代表automationid。注意字符串必须用引号括起来(或者是一个变量 如 @classname=$theclass),如果是双引号,则需考虑转义符。 |
利用数字取代关键字 | ....../0 [@12="myitem" and @11="item2"] | 在上述方式的基础上,将控件类型名称或属性名称换成数字。在windows系统中,所有的控件类型都有一个固定的数字对应,如Button为50000,因此可以用50000代替上面的button,为了进一步的方便,FWScript对数字进行简化,可以忽略前面的数字5,因此可以使用0即可;所有的属性名称也有对应的数字,如classname的对应数字为30012,automationid的数字为30011,Fwscript中,可以使用11代表30011 |
简要方式 | ../button^"Do Again".mybuttonclass&b11] | 很多时候,只需要依据控件的名字、类或Id来确定这个控件元素,因此FWScript提供一种简便的定义模式。紧跟'^'后面的字符串(或变量,后同)为名字;紧跟'.'之后的为类的名称;紧跟'&'之后的为automationid, 字符串可以用引号括起来, 也可以不用, 如果使用双引号括起来, 意味着要考虑里面的转义符, 否则不考虑。 控件类型可以没有。 |
直接指定第几个儿子 | //@5/@4/@3 | 有时在查找控件的时候,儿子的信息完全是雷同的,此时可以使用@符号跟数字明确指定是第几个儿子;如果被测程序的控件结构是稳定的,也可以使用这种办法很快捷地定位到要找到的控件;注意是从1开始计算的 |
直接指定集合中的第几个 | ....../item[@classname="myitem"]/@2 | 如果在上一遍的寻找中,有多个符合条件的控件元素,则在这一遍的寻找中,可以指定是使用上一遍元素集合中的第几个元素,注意是从1开始计算的。 |
找到的元素下的所有儿子 | ....../item[@classname="myitem"]/* | 使用一个星号'*'表示将上一遍找到的元素的所有儿子都放到新的找到的元素集合中,如果前面有多个元素,则将它们所有的儿子都放到新的元素集合中。当开发者需要很具体地处理大批量的元素时,可以使用这个功能。 |
当前窗口与当前元素
每当执行一条查找控件元素的语句后,如果找到了这个控件,则将找到的控件设置为当前元素,这个控件所在的顶层窗口设置为当前窗口
除此之外,还可以通过命令指定当前元素与当前窗口
设置当前元素方式 | 代码示例 | 说明 |
---|---|---|
设置当前元素的父亲为当前元素 | element -/ | 可以设置父亲的父亲 :-/-/ |
设置变量代表的元素为当前元素 | element $1 | 在循环中,需要针对表中不同的元素做同一个动作 |
将当前操作系统中的焦点控件设置为当前元素 | GetFocus | 符号命令为两个冒号“::”,同时设定了当前窗口 |
将当前窗口设定为当前元素 | GetWindow | 符号命令为“:/”,设为当前元素后,后续可以直接操作这个窗口 |
将当前鼠标所在的位置对应的元素设为当前元素 | GetPoint | 符号命令为“:~”,同时设定了当前窗口 |
当通过筛选获得当前控件元素的时候(亦即使用“$=(......)”定位当前控件元素),或者是通过指定变量作为起始位置进行寻找的时候(亦即使用“:$var/......”进行寻找”,不会改变当前窗口。只有在从根节点进行寻找或者是从当前焦点控件或光标处获取当前元素的时候,才会修改当前窗口。
从集合中定位到特定的控件元素
筛选方式 | 代码示例 | 说明 |
---|---|---|
直接指定第几个 | element 5 | 将当前集合中的第5个元素设为当前元素,注意从1开始计算 |
利用表达式进行筛选 | $$=($$.name ~ "*OK") | 括号中是个FWScript表达式,其中可以使用正则表达式,因此使用这种方式的时候,其元素的筛选很灵活。注意如果筛选完后,还有很多元素,则这些元素组成新的当前元素集合,开发者可以进一步进行筛选;如果筛选完后变成了空,则$$的值为False。 |
利用表达式确定出当前元素 | $=($$.name ~ "*OK") | 注意如果筛选完后,还有很多元素,则其中第一个元素为当前元素,系统的log中会有警告信息,如果是个空集合,则当前元素变为Null,但不改变$$的值(一般情况下,如果找不到,则$$设为false,此处例外) |
执行的要求与反馈
在自动化测试中,大多数情况下找到控件是后续执行的必要条件,如果控件没有找到,意味着无法继续执行,此时如果没有特殊的说明,执行器在发现没有找到控件时,会报错然后退出执行。
然而,在某些特殊情况下,自动化测试程序需要“试着”寻找某个控件,如果找到了,就执行相应的操作,如果没有找到,也会继续执行后面的指令。
这种情况下,可以使用如下命令实现:tryelement (代码 :? )相当于element; trygroup(代码:?* 或者 :*? )相当于group。
在执行完一次BizPath的寻找后,如果找到了相关的控件,则$的值为找到的这个控件,如果找到了多个,则$的值为这批控件的第一个(系统会出一个warning信息),$$的值为找到的控件的集合;如果没有找到控件,则$$的值为False,而$的值为null。
在element与group方式下,如果没找到控件,则系统的log中会有报错信息,依据执行时的选择确定是否继续执行
在tryelement与trygroup方式下,如果没找到控件,则系统的log中不会有报错信息,但$$的值为false,$的值为null,系统继续执行。
控件寻找语句例子
方法 | 代码 | 描述 |
---|---|---|
从顶层窗口开始找 | element /Window[@name=”记事本”]/Button[@name=”文件”] element /Window[@name=”记事本”]/?/ element /Window[@name=”记事本”]// | /寻找控件的儿子 /?/寻找控件的孙子 //寻找控件的所有后代 |
从当前元素开始找 | element ./toolbar[@automationid=”1504”] | 在已找到的当前元素的的儿子中寻找控件类型为toolbar,id为1504的元素 |
从当前元素父节点开始找 | element ../toolbar[@automationid=”1505”] | 在已找到的当前元素的兄弟中寻找控件类型为toolbar,id为1505的元素 |
定位到当前元素父节点 | element -/ | 设置当前元素的父亲为当前元素 |
定位到当前元素祖先节点 | element -/-/ | 设置当前元素父亲的父亲为当前元素 |
定位当前焦点元素 | getfocus | 设置当前焦点的控件为当前元素 |
从当前焦点元素开始找 | getfocus ./ | 在当前焦点元素上寻找儿子 |
从当前焦点的窗口开始找 | getfocus // ... ... | 在当前焦点元素上寻找儿子 |
从当前焦点元素父节点开始找 | element :../ | 在当前焦点元素上寻找兄弟 |
元素集合上使用条件过滤 | $=($$.id~=”1*”) ($=后面跟随一个条件表达式) | 按条件表达式从集合中寻找控件 (例子为找到id为1开头的元素) |
获取元素集合 | group /xxxxxxxxx/* | 运用/xxxxxxxxx找到的所有控件的所有儿子设定为当前控件集合 |
利用变量0-9记住元素集合,然后进行查找 | group /xxxxxxxxx/* $0 = $$ | 将控件集合存放到变量$0中 便于后面多次使用 |
利用变量@定位元素 | element $0/@1 | 设定存在$0中的集合中的第1个儿子为当前元素 |
使用条件过滤定位元素 | group /xxxxxxxxx/* :1 | 设定存在$$中的集合中的第1个儿子为当前元素 |
替换当前控件集合 | $$=$1 | 设定存在$1中的集合为当前控件集合 |
符号“$”代表当前元素,可以将它当作一个变量看待,放到表达式中。
符号“$$”代表控件的集合。
<< ToReboot工具 | BizTC测试用例编辑工具 >> |