Maestro 在 BrowserStack 上疑似重复点击按钮,如何避免?
数据阿明
先在点击 CLOSE_ICON 的 tapOn 中显式设置 retryTapIfNoChange: false,排查问题是否由点击重试引起。关闭后等待页面消失,再执行滚动。仅凭视频无法确认 BrowserStack 是否发送了两次点击,也不能排除应用自身重复处理事件。
优先检查点击重试
Maestro 的 tapOn 支持 retryTapIfNoChange。启用后,如果首次点击后没有检测到 UI 层级变化,Maestro 会重试点击。具体参数见 tapOn 官方文档。
一种可能是关闭操作已经发生,但页面变化尚未被及时识别。此时如果触发重试,而新出现的 BACK_ICON 又恰好位于相同位置,就可能误触该按钮。现有信息不足以确定根因,还需要验证这一点。
修改关闭步骤并等待页面消失
先做一个最小修改:
- tapOn:
id: ${output.CLOSE_ICON}
label: "Close New Post page"
retryTapIfNoChange: false
接着增加页面关闭的状态检查。以下示例假设 ${output.CLOSE_ICON} 只匹配待关闭页面中的按钮:
- tapOn:
text: ${output.NEW_POST}
label: "Tap on New Post button"
- assertVisible:
text: ${output.NEW_POST_PAGE}
label: "Verify New Post page opened"
- assertVisible:
id: ${output.CLOSE_ICON}
- tapOn:
id: ${output.CLOSE_ICON}
label: "Close New Post page"
retryTapIfNoChange: false
- assertNotVisible:
id: ${output.CLOSE_ICON}
- scrollUntilVisible:
element:
id: ${output.LIKE_ICON}
assertNotVisible 会等待目标元素消失后再继续,适合用于关闭操作后的状态检查,参见 assertNotVisible 官方文档。如果关闭后的页面有独有标识,还可以断言该标识可见,确认已返回预期页面。
这两个改动的作用不同:retryTapIfNoChange: false 用于禁用该次点击内部的重试;后面的断言用于控制后续步骤开始的时机。只在 tapOn 后面增加等待,无法阻止已经发生在该命令内部的重复点击。
如果仍然误触,逐步缩小范围
- 临时移除后续滚动步骤,让测试在关闭和状态断言后结束。如果仍出现返回操作,优先检查关闭步骤和应用事件处理;如果不再出现,就单独恢复滚动,观察故障发生在哪一步。
- 检查完整调用链。查看是否存在外围
retry、repeat、重复调用的子流程或额外的点击步骤。即使单次tapOn禁用了重试,外围流程仍可能再次执行它。 - 核对实际运行环境。比较本地与 BrowserStack 使用的 Maestro 版本、应用构建和最终执行的 Flow 文件。原问题没有提供版本,不能直接认定两端的默认行为相同。
- 检查选择器和应用日志。确认
CLOSE_ICON与BACK_ICON的实际标识不同,且关闭选择器只匹配预期控件。如果有相关应用日志,可结合自动化步骤日志,判断是出现了两次输入,还是一次输入触发了两次导航。
如果显式禁用重试后问题消失,这会支持点击重试这一解释;如果该选项原本就已禁用,则需要继续检查流程是否重复执行或应用是否重复处理事件。关闭重试后,也应保留状态断言,让未成功关闭的情况明确失败。
备注:内容仅供参考。
