Squish里最让人抓狂的不是一次失败,而是同一段脚本反复卡在等待上,日志里永远是超时,改大超时又把整套回归拖得很慢。要把这类问题处理干净,建议先把等待到底在等什么讲清楚,再把全局超时、按场景等待、按状态等待三套口径重设成一套可重复的规则,后续才不会越补越乱。
一、squish等待条件为什么总是超时
1、把waitForObject当成万能等待在用
waitForObject的语义不是对象存在就行,而是对象需要可交互,包含存在、可见、可用这三件事,控件被遮挡、在滚动区外、处于disabled状态都会一直等到超时。
2、等错了对象状态
很多页面加载过程里对象早就创建出来了,但还没渲染完成或还没启用,这时用waitForObjectExists更贴近需求,反过来如果对象一定存在但只是在等某个属性变化,就不该继续等对象本身。
3、列表、树、表格里等的是行或节点却只等了容器
容器可见不代表目标项已出现,数据异步刷新时更明显,这类场景用waitForObjectItem去等具体项,能显著减少盲等与误点。
4、同步点缺失导致脚本跑得比界面快
录制时如果脚本同步策略偏激进,生成代码会很短,看起来很干净,但一旦环境慢一点就开始超时。录制阶段可以用同步点或让录制器按时间插入snooze,先把时序对齐,再逐步替换成更精确的条件等待。
5、对象映射口径漂移让等待永远等不到
对象库里Real Name包含了动态属性,或父层级改动后映射失效,等待就会稳定超时,表面像等待策略问题,根因其实是对象定位已经错了。
二、squish等待策略应怎样重设
1、先把全局等待上限改成可控的基线值
打开Squish IDE,选中测试套件后进入【Test Suite Settings】→【Test Settings】,找到waitForObjectTimeout并设置为团队统一值,单位是毫秒,建议先用一个中等值作为基线,避免默认过大导致失败时整套用例被拖慢,也避免过小导致慢环境下大量误报。
2、按场景拆分等待函数,而不是到处加长超时
把等待分成三类去用:等可交互用waitForObject,等对象存在用waitForObjectExists,等列表项用waitForObjectItem,避免所有地方都用waitForObject硬等到可交互。
3、把等待从对象层升级到状态层
页面真实可用往往由一个状态信号决定,比如加载遮罩消失、某个按钮从disabled变enabled、某个标签文本变成就绪,这类更适合用waitFor去等一个布尔条件成立,而不是反复找同一个对象。
4、把等待写在切换点,而不是写在每一步
只在三类节点强制等待:页面切换后、弹窗出现前后、数据刷新触发后。其余步骤让waitForObject自然起到同步作用,避免把脚本写成到处都是等待,后期维护会越来越重。
5、录制阶段先稳,再瘦身
如果当前用例大量超时,先在【Edit】→【Preferences】→【Squish】→【Recording】→【Script Synchronization】选择按时间同步的录制方式,让录制器自动插入必要的等待,把流程先跑通,再把snooze逐段替换成waitFor或更精确的对象等待。
三、squish等待规则应怎样落到套件结构里
1、在Shared Scripts里建立统一等待入口
把常用等待封装成统一函数,例如等待页面就绪、等待弹窗出现、等待数据加载完成,用例里禁止直接散写自定义超时,避免同一问题被十个人用十种写法修补。
2、给每类等待设定默认值与上限
对象可交互等待用基线超时,数据加载等待允许更长但必须有明确触发点,属性变化等待用短轮询加上限,超过上限直接失败并输出关键上下文,避免无限拖延。
3、把超时失败的证据固定成标准动作
超时发生时统一做三件事:截图、打印当前窗口层级或关键对象属性、输出当前阶段标签,保证每次超时都能看出是在等对象、等状态还是等数据。
4、对慢节点与远程节点单独设定口径
远程执行和本地执行的时延分布不同,建议在套件配置里按环境标签区分一组超时基线,不要用一套参数兼容所有机器,否则要么本地浪费时间,要么远程大量误报。
5、定期做一次等待点清理
每次版本迭代后抽查等待点,删除无意义的snooze,合并重复等待,把同类等待迁移到公共库,等待策略越维护越简洁才会越稳定。
总结
Squish等待总超时,最常见的原因是把waitForObject当成存在判断来用、把状态变化误当成对象变化、以及同步点缺失导致脚本抢跑。重设策略时先统一waitForObjectTimeout基线,再按对象存在、可交互、容器项、状态条件四类场景拆分等待手段,并把等待入口收敛到Shared Scripts统一治理,超时就会从偶发变成可定位、可复现、可修复。