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

问题描述

我想利用最近在iOS 14中引入的inline日期选择器样式。但是,我需要对几个XCUITests进行调整,其中包括以前的选择器轮样式。

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

例如 TextField,{{178.3,401.7},{74.7,36.3}},label: 'Time',value: 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,所以我没有真正看到日历视图,只有时间输入字段。

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

日期选择器的配置如下:

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

以前,日期选择器显示一个选择器轮,我在XCUITest中访问它没有问题。我可以简单地称其为调整拾纸轮的值: pickerWheels.element(boundBy: index).adjust(toPickerWheelValue: value)

但是,在日期选择器设置为inline的情况下,上一个查询不再起作用。我还检查了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,value: 01:00
    }

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

解决方法

我最终创建了一个仅包含UIDatePicker的示例视图控制器,以查看是否可以在XCUITest中访问它。

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

datePicker的后代看起来像这样:

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

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

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

,

在使用typeText更改其值之前,请确保它具有焦点。尝试先tap文本字段,然后可以通过typeText更改值。