You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

iOS 16设备UI测试中如何关闭DatePicker弹窗?

iOS 16下SwiftUI Compact DatePicker UI测试关闭弹窗问题

问题场景

定义了采用compact样式的DatePicker:

struct ContentView: View {
    
    @State private var selectedDate = Date()
    
    var body: some View {
        DatePicker("Date Selected", selection: $selectedDate, displayedComponents: [.date])
            .accessibilityIdentifier("DatePicker")
            .datePickerStyle(.compact)
    }
}

编写的UI测试步骤:

  • 点击DatePicker显示弹窗;
  • 点击弹窗中某一日期完成选择;
  • 再次点击DatePicker关闭弹窗。

测试代码:

func test_date_picker() {
    let application = XCUIApplication()

    // 0. Launch the app
    application.launch()
        
    // 1. Show the DatePicker popup
    application.datePickers["DatePicker"].tap()
        
    // 2. Change the selected date
    application.datePickers.collectionViews.buttons["Friday, November 25"].tap()
        
    // 3. Dismiss the DatePicker popup
    application.datePickers["DatePicker"].tap()
}

该测试在iOS 14、iOS 15设备上正常运行,但在iOS 16设备上,最后一行application.datePickers["DatePicker"].tap()调用失败,原因是目标控件不可点击。

解决方案

iOS 16对Compact DatePicker的弹窗交互做了调整:选择日期后,原DatePicker控件会被弹窗遮挡,无法直接点击;同时弹窗底部新增了“完成”按钮,也可通过点击空白区域关闭弹窗。以下是几种可行的修复方案:

方案1:点击弹窗的“完成”按钮

直接定位弹窗的“Done”(中文环境为“完成”)按钮点击,适配iOS 16的交互逻辑:

func test_date_picker() {
    let application = XCUIApplication()
    application.launch()
        
    // 1. Show the DatePicker popup
    application.datePickers["DatePicker"].tap()
        
    // 2. Change the selected date
    application.datePickers.collectionViews.buttons["Friday, November 25"].tap()
        
    // 3. Dismiss the DatePicker popup (iOS 16+)
    application.buttons["Done"].tap()
}

方案2:点击屏幕空白区域

如果不想依赖“完成”按钮的文本(避免多语言适配问题),可以点击屏幕上DatePicker弹窗以外的空白区域:

func test_date_picker() {
    let application = XCUIApplication()
    application.launch()
        
    // 1. Show the DatePicker popup
    application.datePickers["DatePicker"].tap()
        
    // 2. Change the selected date
    application.datePickers.collectionViews.buttons["Friday, November 25"].tap()
        
    // 3. Dismiss by tapping outside the popup
    let window = application.windows.firstMatch
    window.coordinate(withNormalizedOffset: CGVector(dx: 0.1, dy: 0.1)).tap()
}

方案3:按iOS版本适配

为了兼容iOS 14/15和iOS 16的不同逻辑,可以通过系统版本判断执行对应操作:

func test_date_picker() {
    let application = XCUIApplication()
    application.launch()
        
    // 1. Show the DatePicker popup
    application.datePickers["DatePicker"].tap()
        
    // 2. Change the selected date
    application.datePickers.collectionViews.buttons["Friday, November 25"].tap()
        
    // 3. Dismiss based on iOS version
    if #available(iOS 16.0, *) {
        application.buttons["Done"].tap()
    } else {
        application.datePickers["DatePicker"].tap()
    }
}

内容的提问来源于stack exchange,提问作者Adil Hussain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:15:42