探索数字表冠、触控板和 iPad 指针自动化
Explore Digital Crown, Trackpad, and iPad pointer automation
2021年6月10日
一句话判断
如果你在做无障碍测试,Xcode 13 新增的 UI 自动化 API 让你能在测试中模拟数字表冠旋转、触控板手势和 iPad 指针操作——终于不用手动测了。
这场 Session 讲了什么
Session 介绍了 XCTest 在 Xcode 13 中新增的输入模态自动化能力。之前 UI 测试主要模拟触摸事件(tap、swipe、type),但在实际场景中用户还使用其他输入方式:Apple Watch 的数字表冠(Digital Crown)、iPad 配对的触控板(Trackpad)和鼠标指针。
新增的 API 包括:XCUIElement 的 rotateDigitalCrown 方法(模拟表冠旋转)、scroll 方法的增强(支持触控板的双指滚动和惯性滚动)、以及完整的指针(Pointer)事件模拟链(hover、right-click、drag 等)。这些 API 让你能在 CI 中自动化测试这些交互场景。
Session 还强调了这些 API 对无障碍测试的重要性。很多依赖辅助技术的用户正是通过这些替代输入方式使用 App,自动化测试能确保你的 App 对这些用户也是可用的。
值得深挖的点
数字表冠的旋转粒度
数字表冠在 watchOS 中是最常用的输入方式,但之前没有自动化测试的手段。新的 rotateDigitalCrown API 支持指定旋转方向(顺时针/逆时针)和旋转量(以 WKInterfacePicker 的 item 数量为单位)。你可以精确模拟”旋转两格”或”连续旋转五格”的操作,验证 Picker、列表滚动和自定义控件的响应。
iPad 指针交互的完整覆盖
iPadOS 的指针交互模型比触摸复杂得多——有 hover 状态、右键点击、拖放、以及触控板特有的三指手势。Xcode 13 的指针自动化 API 覆盖了这些场景。你可以模拟指针移到某个元素上方(触发 hover 效果)、右键点击打开菜单、从 A 拖到 B 完成拖放。这些测试对适配了 iPad 指针交互的 App 来说是必需的。
代码片段
模拟数字表冠旋转
func testDigitalCrownPicker() {
let app = XCUIApplication()
app.launch()
let picker = app.pickers["timePicker"]
// 顺时针旋转两格
picker.rotateDigitalCrown(.forward, rotations: 2)
// 验证 picker 的值变化
XCTAssertEqual(picker.value as? String, "2:00")
// 逆时针旋转一格
picker.rotateDigitalCrown(.backward, rotations: 1)
XCTAssertEqual(picker.value as? String, "1:00")
}
模拟触控板手势
func testTrackpadScrollAndZoom() {
let app = XCUIApplication()
app.launch()
let scrollView = app.scrollViews["contentScrollView"]
// 模拟触控板双指滚动
scrollView.scroll(byDeltaX: 0, deltaY: -300)
// 模拟双指缩放(pinch to zoom)
scrollView.pinch(withScale: 2.0, velocity: 1.0)
// 验证缩放后的内容
let zoomedImage = app.images["detailImage"]
XCTAssertTrue(zoomedImage.exists)
}
模拟 iPad 指针交互
func testPointerHoverAndClick() {
let app = XCUIApplication()
app.launch()
let button = app.buttons["menuButton"]
// 模拟指针 hover 到按钮上方
button.hover()
// 验证 hover 状态的视觉效果
XCTAssertTrue(button.images["hoverHighlight"].exists)
// 右键点击
button.rightClick()
// 验证上下文菜单出现
let menuItem = app.menuItems["editAction"]
XCTAssertTrue(menuItem.waitForExistence(timeout: 2))
}
最佳实践
无障碍测试: 把指针交互和触控板交互纳入测试覆盖范围。如果你的 App 支持 iPad 指针或 Apple Watch,每个关键交互路径都应该有对应的自动化测试。这些输入方式的使用者往往是无障碍用户,测试覆盖对他们尤为重要。
CI 集成: 在 CI 中增加一个专门跑指针交互和表冠交互的测试计划(Test Plan)。这些测试可能比普通触摸测试慢一些,单独跑可以不影响主测试套件的速度。
还有什么值得关注
XCUIElement新增了hover()方法,可以模拟指针悬浮但不确定触发的状态。- 触控板的惯性滚动(inertial scrolling)也可以在自动化中模拟。
- 这些 API 在 Xcode Cloud 中也可以运行,不需要特殊的硬件配置。