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
相关产品推荐
相关产品推荐

