Record, replay, and review: UI automation with Xcode
2025年6月9日
一句话判断
Xcode 的 UI 自动化工作流终于形成闭环了 — Record 录制交互生成代码,Test Plan 配置多语言/多设备回放,Xcode Cloud 云端执行,Test Report 带视频回放和故障点定位。关键是 accessibility 做好了,UI 自动化自然就好用了。
这场 Session 讲了什么
Max 完整展示了 Xcode UI 自动化的四个阶段:
准备阶段:UI 自动化基于 accessibility 框架 — accessibility 提供元素类型、标签、值和 frame,UI 自动化依赖这些信息与 app 交互。关键准备步骤:添加 accessibilityIdentifier(唯一、描述性、不随本地化变化),用 Accessibility Inspector 检查无障碍属性,添加 UI testing target。
录制阶段:在 UI test 源文件中启动录制,Xcode 自动构建并启动 Simulator。你的每次点击、滑动、输入都被录制为 Swift 代码。录制后选择最合适的元素查询方式 — 有 localized string 的元素优先用 accessibility identifier,深层嵌套用最短查询,动态内容用通用查询。添加 waitForExistence 和 XCTAssert 做验证。可设置设备状态(方向、外观、模拟位置)和 app 启动参数(launchArguments、launchEnvironment)。
回放阶段:用 Test Plan 配置多语言/多设备运行。每个 locale 是一个 configuration。UI 自动化相关设置包括录制视频/截图的策略(默认仅失败时保留,可改为全部保留)。Xcode Cloud 可以在云端运行相同的 test plan,覆盖 iPhone、iPad 等多种设备和英/阿/希/德等多种语言。
审查阶段:Xcode Test Report 支持视频回放,交互点以圆点叠加在视频上。失败时刻有 diamond 标记,点击跳转到故障点。故障时刻的 UI 元素叠加显示在视频上,点击元素可以看到代码推荐。可以从 Test Report 直接 View Source 定位到测试代码并修复。
值得深挖的点
-
Accessibility 是 UI 自动化的基础设施。这不是”做好事”的技术决策,而是直接影响你的自动化质量。
accessibilityIdentifier是 UI 自动化定位元素最可靠的方式,它不随语言变化、不受内容更新影响。 -
录制后的查询选择很重要。Xcode 提供多个选项,选择原则:有 identifier 用 identifier,深层嵌套选最短路径,动态内容选通用查询。这决定了你的测试在未来 app 变化后的稳定性。
-
Test Plan 的多配置是效率倍增器。一个 test plan 配置阿拉伯语(RTL)和德语(长字符串)两个 locale,一次运行就能发现布局问题。这比手动切换语言测试高效得多。
-
Xcode Cloud 的视频录制是协作利器。团队成员不需要在本地复现问题,直接看云端运行的视频就能理解失败原因。
-
Accessibility Audit 可以集成到 UI 测试中。在 UI test 中调用
performAccessibilityAudit()自动检查无障碍合规性。
代码片段
录制后的 UI 测试代码:
class LandmarksUITests: XCTestCase {
func testCreateCollection() {
let app = XCUIApplication()
app.launch()
// 用 accessibility identifier 定位
app.buttons["collectionsButton"].tap()
app.buttons["addCollectionButton"].tap()
// 选择查询方式(录制后从下拉菜单选择)
app.textFields.firstMatch
.tap()
.typeText("Max's Australian Adventure")
// 添加验证
let collection = app.buttons["Max's Australian Adventure"]
XCTAssertTrue(collection.waitForExistence(timeout: 3))
}
override func setUp() {
super.setUp()
// 设置设备状态
let app = XCUIApplication()
app.launchArguments = ["--uitesting"]
app.launchEnvironment = ["REGION": "AU"]
}
}
在 UI test 中做无障碍审计:
func testAccessibility() throws {
let app = XCUIApplication()
app.launch()
try app.performAccessibilityAudit()
}
最佳实践
-
先做 accessibility,再做 UI 自动化。
accessibilityIdentifier是 UI 自动化的地基。没有好的 accessibility,录制出来的代码要么不稳定,要么不可维护。 -
用 Xcode 的 coding assistant 批量添加 accessibility identifiers。写一句 “Add accessibility identifiers to the relevant parts of this view”,它会自动处理。
-
Test Plan 至少配三个 locale:你的默认语言、一个 RTL 语言(如阿拉伯语)、一个长字符串语言(如德语)。这覆盖了大部分国际化问题。
-
视频和截图设置为”全部保留”。默认只保留失败的,但通过的运行视频对文档、教程、marketing 也有用。
-
录制后立即重构查询。把录制的默认查询替换为你精选的 identifier 或最短路径,否则后续维护成本很高。
还有什么值得关注
- UI 自动化支持所有 Apple 平台:iOS、iPadOS、macOS、watchOS、tvOS、visionOS(Designed for iPad)。同一套自动化可以在多个平台运行。
XCUIApplication的open(_ url:)方法可以测试 deep link 和 URL scheme。- Accessibility Inspector 是 Xcode 内置工具,从 Open Developer Tool 或 Spotlight 启动,用于检查任何 view 的无障碍属性。
- “Perform accessibility audits for your app”(WWDC23)介绍了在 UI test 中集成无障碍审计的详细方法。