Squish在录制测试时,会为界面对象建立符号名称和实际识别规则,执行测试时再根据对象属性去定位AUT中的控件。处理“Squish怎么设置对象识别规则,Squish对象映射失效如何排查”时,重点不是让规则包含越多属性越好,而是选择稳定、能够唯一识别对象的属性。窗口标题、动态文本、序号等容易变化的属性一旦被写入Object Map,界面稍有调整就可能导致原有脚本无法找到对象。Squish 9.2仍以Symbolic Name和Real Name的映射作为对象识别的重要机制。
一、Squish怎么设置对象识别规则
对象识别规则主要保存在【Object Map】中。每个条目包含一个便于脚本调用的Symbolic Name,以及由多个属性组成的Real Name。调整时应优先保留稳定属性,再根据唯一性增加必要条件。
1、先查看对象当前使用了哪些属性
①启动AUT,并进入需要识别控件所在的界面。
②在Squish IDE中打开【Object Map】。
③找到目标Symbolic Name,查看对应Real Name。
④同时使用【Spy】或【Object Picker】选中真实对象。
⑤在【Properties】中对比【type】【name】【text】【container】等属性当前值。
对于多数GUI工具包,【type】通常是Real Name中的基础属性;Qt对象还可以使用【name】、【container】、【buddyText】等属性辅助区分。
2、优先保留稳定且具有区分度的属性
①如果控件具有长期不变的objectName,优先保留【name】。
②同类型对象较多时,再增加【container】或关联标签等属性。
③删除版本号、当前文件名、随机编号等容易变化的属性。
④修改后点击【Check Existence】,确认对象仍能被找到。
⑤再使用【Highlight Object】,确认实际匹配的就是目标控件。
Squish官方指出,Real Name属性太多会让对象容易因界面变化而失效,属性太少又可能同时匹配多个对象,因此规则应在【稳定性】和【唯一性】之间取得平衡。
3、动态文本改用通配符匹配
窗口标题、按钮文本或标签内容会动态变化时,不适合继续使用完全匹配。
①在【Object Map】中找到变化的字符串属性。
②双击属性和值之间的匹配运算符。
③简单变化优先调整为【Wildcard】。
④只有通配符不足以表达条件时,再使用【Regular Expression】。
⑤修改后分别在几种界面状态下执行【Check Existence】。
例如窗口标题固定以产品名开头、后面跟当前文件名时,可以只匹配固定部分。Squish允许多数字符串属性使用精确、Wildcard或正则表达式匹配,但【type】等特殊属性仍要求精确匹配;官方也建议能够使用Wildcard时优先使用,维护成本通常低于正则表达式。
二、Squish对象映射失效如何排查
对象映射失效时,常见表现是waitForObject()超时、测试步骤突然找不到控件,或者脚本找到了错误对象。排查时应先验证Object Map本身还能不能定位对象,再进一步判断是属性变化、层级变化还是对象出现时机发生变化。
1、先用Object Map确认对象是否还能匹配
①启动AUT并进入报错步骤对应界面。
②打开【Object Map】,找到失败的Symbolic Name。
③执行【Check Existence】。
④如果显示无法找到,再执行【Show in Application Objects】或使用Spy重新拾取当前对象。
⑤把当前Real Name与原映射逐项比较。
如果【Check Existence】已经失败,说明重点应检查对象规则;如果这里能够正确找到对象,而脚本运行仍超时,则还需要检查对象出现时机或测试流程。
2、检查是否有属性值发生变化
①先比较【name】【text】【windowTitle】等直接属性。
②再检查【container】【window】等父级关联是否发生变化。
③发现动态文本后,将其删除或改成Wildcard。
④发现控件objectName被开发修改时,更新对应Real Name。
⑤保存Object Map后重新执行原失败步骤。
Squish在运行时会把Real Name中的属性作为查找条件,其中任何一个要求精确匹配的值变化,都可能导致整个符号对象名失效。
3、重点检查container和occurrence
界面改版后,即使按钮文字没有变化,父容器或同类控件数量变化也可能让旧映射失效。
①查看Real Name中是否包含【container】。
②确认目标控件是否被移动到新的面板、窗口或标签页。
③检查是否存在【occurrence】属性。
④如果新增了相同控件,确认原序号是否已经变化。
⑤尽量用稳定的【name】、标签关系或容器关系替代过度依赖【occurrence】。
【occurrence】用于区分属性完全相同的多个对象,因此界面新增同类控件后,它的序号可能变化,更适合在没有稳定属性时作为补充,而不宜成为主要识别依据。
4、对象能找到但脚本仍失败时检查等待逻辑
①在失败位置前使用【object.exists()】确认对象当前是否存在。
②对象需要等待显示时继续使用【waitForObject()】。
③对象已经存在但暂时不可见时,检查是否错误依赖可见状态。
④确认测试步骤是否在窗口或页面真正加载完成后才执行。
⑤不要简单通过持续增加固定延时掩盖对象状态问题。
Squish的waitForObject()会等待对象可见并可用,默认找不到时会产生LookupError;object.exists()则适合快速判断对象当前是否存在。
三、对象规则修复后怎么提高后续稳定性
对象映射修好以后,还应检查这次失效是不是由一类共同问题造成。否则界面下一次升级后,同样的动态属性还会在其他对象上继续触发失败。
1、统一清理容易变化的识别属性
①筛选同一页面中的主要Symbolic Name。
②检查是否大量使用版本号、业务数据、窗口动态标题等属性。
③能使用【name】或稳定容器关系时优先替换。
④动态字符串统一改成合理的【Wildcard】规则。
⑤逐个使用【Highlight Object】确认修改后没有匹配到其他控件。
2、修改界面后优先维护Object Map
①AUT升级后先运行一组核心冒烟测试。
②发现对象识别失败时,优先修改对应Object Map条目。
③不要直接在大量测试脚本中替换Real Name。
④修复一个Symbolic Name后重新运行所有引用该对象的用例。
Symbolic Name的价值就在于把脚本调用与真正的属性规则分开。Squish官方也建议尽量使用Symbolic Name,这样对象层级或属性变化后,可以集中修改Object Map,而不必逐个修改测试脚本。
总结
Squish对象识别是否稳定,核心取决于Real Name中使用的属性是否既稳定又足够唯一。对象映射失效后,先通过Object Map确认是否还能找到对象,再比较属性、父级容器和occurrence变化,可以较快判断问题发生在哪一层;如果映射本身正常,则继续检查对象出现时机和等待逻辑。把动态文本从精确匹配调整为更稳定的规则,并长期通过Symbolic Name集中维护对象映射,可以明显减少界面调整带来的脚本失效。如需进一步了解Squish对象识别规则设置、Object Map维护及对象映射失效排查方法,欢迎联系咨询。