XCUITest:如何禁用iOS Safari动画以解决UI自动化卡顿问题
XCUITest测试Safari时动画等待卡住的问题解决
UIView.setAnimationsEnabled(false)的作用范围
UIView.setAnimationsEnabled(false)只对原生App内的UIKit动画有效,完全无法控制Safari中网页的CSS/JS动画——网页动画由WebKit引擎渲染,不属于UIKit的动画体系,所以用这个方法解决Safari测试中的等待卡住问题根本无效。
可行的替代解决办法
针对Safari自动化测试中出现的「Wait for app to idle」超时卡住问题,推荐以下实用方案:
- 换用显式等待策略:
不要依赖XCUITest自动的idle等待,改用显式等待指定元素出现。比如用XCUIElement.waitForExistence(timeout:)精准控制等待时长,避免无意义的全局动画等待。 - 关闭Safari的网页动画:
测试前通过Safari设置关闭网页动画:打开Safari→进入「设置」→「Safari浏览器」→「高级」→「实验性特性」,找到「CSS动画」「JavaScript动画」相关选项并关闭。这个设置流程可以用XCUITest自动化完成,作为测试前置步骤。 - 调整XCUITest超时配置:
在测试代码中修改XCUIApplication的defaultTimeout,或者针对特定操作设置自定义超时,避免因默认超时过长导致卡住。示例代码:let safariApp = XCUIApplication(bundleIdentifier: "com.apple.mobilesafari") safariApp.defaultTimeout = 10 // 缩短默认等待超时 - 优化测试操作路径:
分析测试流程中哪些操作会触发网页动画(比如页面跳转、元素加载动画),调整测试步骤:要么等待页面完全加载后再进行下一步,要么直接定位到最终状态的元素,跳过动画过程。
参考思路:原讨论提到,XCUITest的idle等待机制会监听App的动画完成通知,当网页动画持续运行时,Safari不会发送该通知,进而导致测试卡住。核心解决思路是绕过或关闭不受UIKit控制的动画源。
内容的提问来源于stack exchange,提问作者coldcake71
相关产品推荐
相关产品推荐

