Explore Digital Crown, Trackpad, and iPad pointer automation
Accessibility 进阶 20m

探索数字表冠、触控板和 iPad 指针自动化

Explore Digital Crown, Trackpad, and iPad pointer automation

2021年6月10日

在 Apple 官方观看视频

一句话判断

如果你在做无障碍测试,Xcode 13 新增的 UI 自动化 API 让你能在测试中模拟数字表冠旋转、触控板手势和 iPad 指针操作——终于不用手动测了。

这场 Session 讲了什么

Session 介绍了 XCTest 在 Xcode 13 中新增的输入模态自动化能力。之前 UI 测试主要模拟触摸事件(tap、swipe、type),但在实际场景中用户还使用其他输入方式:Apple Watch 的数字表冠(Digital Crown)、iPad 配对的触控板(Trackpad)和鼠标指针。

新增的 API 包括:XCUIElementrotateDigitalCrown 方法(模拟表冠旋转)、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 中也可以运行,不需要特殊的硬件配置。
WWDC 2021