Squish跑到一半突然报Object not found,很多时候并不是脚本写错,而是对象在运行时的属性变了或出现时机变了,导致对象库里那条映射失效。处理这类问题,先把失败原因定位清楚,再用“更新已有映射”替代“整套重录”,通常更快也更稳。
一、squish对象为什么识别失败
1、对象库里的Real Name属性已经不匹配
Squish录制时会把对象写进Object Map,也就是对象库,保存的是Symbolic Name加Real Name的成对映射,Real Name由多组属性组成,界面改版或控件层级微调后,旧属性组合就可能再也找不到同一个对象。
2、对象属性里带了动态内容
典型表现是窗口标题带版本号或时间戳,按钮文案从OK改成确定,列表项文本随数据刷新变化,录制时把text这类易变属性写进Real Name,回放时自然就匹配不上,尤其在多语言环境下更常见。
3、同类控件太多导致occurrence漂移
一排相同按钮或多行相似表格项,录制时可能靠occurrence区分,页面排序、分页加载或新增一行后,occurrence对应的对象就换了,脚本看起来“对象识别失败”,本质是定位条件不再唯一。
4、对象出现时机变了但脚本等待不够
控件延迟渲染、弹窗动画、页面异步加载,都可能让waitForObject在超时前拿不到对象,从而触发Object Not Found,很多现场问题是环境变慢或网络变慢后才暴露出来。
5、脚本找错了上下文窗口或层级
同名窗口重复打开、对话框在遮罩层里、控件被放进新的容器,都会让原来的父层级路径失效,Pick工具能点到但脚本跑不到,通常就是上下文没切对或父对象链条变了。
二、squish对象库应怎样重新录制
1、先用Object Not Found对比新旧属性
在IDE里让用例跑到失败位置,弹出Object Not Found后点击【Pick New Object】,在AUT界面点选当前真实控件,先看变化的是text还是objectName还是父层级,这一步能避免盲目重录把问题越做越大。
2、优先更新旧条目而不是新增一堆条目
在对象库里定位到该对象的Symbolic Name,启动AUT并打开到控件所在页面,然后在Application Objects窗口点击【Pick】选中目标控件,再对选中项右键选择【Copy Real Name】,回到Object Map选中旧条目后点击【Replace Real Name】完成替换并保存,这种方式对脚本侵入最小。
3、确实改得太多时再“重录为新对象”
如果控件类型变了或父层级完全重构,更新旧条目会变得很别扭,可以在Object Map里点击【Add】或在Spy界面选中对象后选择加入Object Map,给一个新的Symbolic Name,再把脚本里引用点逐步替换到新Symbolic Name,避免在旧条目上硬改造成连锁影响。
4、重录时就把易变属性剔出去
在Real Name属性列表里,优先保留稳定属性,例如objectName、id、type、class,谨慎使用text、title、window等易变字段,必要时对文本用通配符或正则匹配固定片段,做到既能命中又不至于误命中。
5、重录完立刻做一次回归验证
保存对象库后不要只跑失败那一步,至少把同页面的两个到三个关键流程跑一遍,确认没有因为属性放宽导致点到同类控件,尤其是表格行、重复按钮、动态列表这三类场景。
三、squish对象属性应怎样核对
1、用Check Object Existence批量验库
打开Object Map视图,选中一批近期改过的Symbolic Name,右键点击【Check Object Existence】,让IDE直接验证这些映射在当前AUT里是否还能找到对象,能提前把“潜在炸点”揪出来。
2、把识别规则做成两层口径
第一层用于日常回放,属性尽量稳定且精简,第二层用于定位异常时临时加严,例如加上容器、加上局部文本,问题解决后再回到精简口径,避免对象库越堆越重越难维护。
3、对动态对象优先锚定稳定父对象
遇到动态生成的列表项、树节点或临时弹层,先在对象库里锁定一个稳定的父对象,再通过父对象下的层级查找或属性过滤定位子对象,能显著降低因对象“创建又销毁”带来的识别失败风险。
4、把等待与对象识别分开处理
如果Pick能点到但回放找不到,先把等待问题排除,在关键动作前后加更明确的等待条件,例如等待窗口可见、等待加载完成标志出现,再去改对象属性,避免把“没出现”误当成“识别失败”。
5、建立一套对象库变更记录
每次改对象库,记录改了哪个Symbolic Name、改动原因是文案变化还是层级变化、是否用到通配符,下一次同类问题出现时定位会快很多,也能减少重复重录造成的对象库膨胀。
总结
Squish对象识别失败多半来自对象库映射失效、属性动态变化、同类控件导致定位漂移或等待不足。按“先对比属性再更新条目”的思路,用【Pick New Object】找差异、用【Replace Real Name】做精确替换,并配合【Check Object Existence】做批量核对,再把动态属性改为更稳定的识别口径,通常能把对象库维护从反复重录变成可控的小修小补。