ios - 如何在 XCUITest 中访问 iOS 14 时间选择器

标签 ios uidatepicker ios14 xcuitest

我想利用 iOS 14 最近引入的内联日期选择器样式。但是,我需要对几个包含之前的选择器轮样式的 XCUITest 进行调整。

问题是我根本无法更改时间选择器的值。我注意到时间选择器不是 XCUITest 中的 picker 也不是 pickerWheel 元素;相反,它是一个 textField 元素。

例如 TextField, {{178.3, 401.7}, {74.7, 36.3}},标签:“时间”,值:12:01

像典型的文本字段一样更改其值根本不起作用(typeText 不执行任何操作)。我尝试访问似乎位于文本字段内的选择器轮,但检查其后代返回空。

po timeInput.descendants(matching: .any).count
t =   799.62s Get number of matches for: Descendants matching type Any
0 // no descendants found

那么如何更改 XCUITest 中时间选择器文本字段的值?

编辑:

UIDatePicker 的日期选择器模式设置为 time,因此我并没有真正看到日历 View ,只是看到时间输入字段。

我将日期选择器放在 UITableViewCell 的 contentView 内,然后在点击另一个 TableView 单元格时添加该日期选择器(即动态添加)。

日期选择器的配置如下:

picker.datePickerMode = .time
picker.date = Date(timeInterval: time, since: date)
picker.minuteInterval = intervals
if #available(iOS 14, *) {
    picker.preferredDatePickerStyle = .inline
}

以前,日期选择器显示为选择器轮,我在 XCUITest 中访问它没有问题。我可以简单地调用它来调整选择器轮的值: pickerWheels.element(boundBy:索引).调整(toPickerWheelValue:值)

但是,将日期选择器设置为内联后,之前的查询将不再有效。我还检查了 pickerdatePicker 元素,但它们也返回空结果。我可以看到一个带有“时间”标签的文本字段元素,并且该值包含时间选择器中设置的任何值。

(lldb) po app.pickers.count
t =  2270.22s Get number of matches for: Descendants matching type Picker
0 // No results

(lldb) po app.pickerWheels.count
t =  2277.07s Get number of matches for: Descendants matching type PickerWheel
0 // No results

(lldb) po app.datePickers.count
t =  2286.58s Get number of matches for: Descendants matching type DatePicker
0 // No results

(lldb) po app.textFields.count
t =  2302.55s Get number of matches for: Descendants matching type TextField
1 // 1 element matched

(lldb) po app.textFields
t =  2308.08s Requesting snapshot of accessibility hierarchy for app with pid 55829
t =  2308.46s Find: Descendants matching type TextField
t =  2308.47s Requesting snapshot of accessibility hierarchy for app with pid 55829
t =  2308.61s Find: Descendants matching type TextField
t =  2308.61s Requesting snapshot of accessibility hierarchy for app with pid 55829
Find: Target Application
  Output: {
    Application, pid: 55829, label: 'Projects'
  }
  ↪︎Find: Descendants matching type TextField
    Output: {
      TextField, {{178.3, 401.7}, {74.7, 36.3}}, label: 'Time', value: 01:00
    }

所以我看不到任何选择器,但我有一个文本字段,其值设置为日期选择器的时间输入值。我尝试使用 typeText 更改文本字段的值,但它似乎根本没有执行任何操作。

最佳答案

我最终创建了一个示例 View Controller ,其中仅包含 UIDatePicker,以查看是否可以在 XCUITest 中访问它。

有趣的是,我能够在 XCUITest 中检测到 datePicker 元素,而在 TableView 中动态添加 UIDatePicker 时我无法做到这一点。

datePicker 的后代看起来像这样:

Find: Descendants matching type DatePicker
Output: {
  DatePicker, {{89.3, 423.3}, {196.7, 53.3}}
}
↪︎Find: Descendants matching type Any
  Output: {
    Other, {{89.3, 423.3}, {196.7, 53.3}}
    Other, {{89.3, 431.3}, {196.7, 37.3}}
    Other, {{89.3, 431.3}, {196.7, 37.3}}, label: 'Time Picker'
    TextField, {{97.3, 431.3}, {74.7, 36.3}}, label: 'Time', value: 05:54
    SegmentedControl, {{178.0, 431.3}, {100.0, 36.3}}
    Button, {{178.0, 431.3}, {49.0, 36.3}}, label: 'AM'
    Button, {{228.0, 431.3}, {50.0, 36.3}}, label: 'PM', Selected
  }

时间输入字段仍然是一个文本字段元素,但我可以使用 typeText 更改其值。我怀疑我们的代码库中有些东西处理 valueChanged 委托(delegate),导致 typeText 无法工作。

底线,使用 typeText 更改时间输入选择器的值应该可以正常工作。

关于ios - 如何在 XCUITest 中访问 iOS 14 时间选择器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64437121/

相关文章:

ios - 在 UIScrollView 中嵌入 UICollectionView 几乎完美

iphone - iPhone-通讯录搜索崩溃

ios - 如何在 Swift 的日期选择器上设置本地通知时间

objective-c - 将当前时间四舍五入为最接近的 30 分钟间隔 Obj c

iOS:保存日期选择器的设置

ios14 - 从 Xcode 启动 App Clip 时未调用 SceneDelegate 的 "continue"

ios - iPhone、Xcode、有效架构的重要性

ios - UIView KVO : Why don't changes to "center" cause KVO notifications for "frame"?

admob - 展示 Admob 广告是否需要 ATT 通话?

ios - 如何使用 PHPickerViewController 仅显示有限的照片?