UIPickerView 和 UI 单元测试:如何获取 UIPickerWheel 的值?

UIPickerView and UI Unit Test: How to get values of UIPickerWheel?

最近我很头疼(而且我仍在努力)找出如何检索 UIPickerWheel 中的所有值。对我来说应该足以在车轮的特定行移动,但我不能!太令人沮丧了!我试图逐行滚动以检索所有值 (),但速度太慢了!有什么线索吗?

注意:我不能使用 adjustToPickerWheelValue 因为我的根本问题是我不知道这个值,因为它们是动态的,我想避免 launchArguments/launchEnvironment.

这可能不是您希望得到的答案,但不可能在 UI 测试中获得 UIPickerView 中所有行的标题。

如您所知,当 运行 进行 UI 测试时,您只能通过 XCUIElement class 访问您应用的 UI 元素。 class 有一个 value 属性 可以为您提供有关您访问的 UI 元素的一些信息。访问 UIPickerView 时,value 会为您提供当前 select 行的标题。但仅限于 selected 行。您可以访问选择器的行元素,但不幸的是,行元素的 value 属性 始终为空。所以,这里没有运气。你所能得到的所有信息就是你的选择器的行数。

不过这并不奇怪。即使您可以访问 UIPickerView,您也无法直接访问所有行的标题。 UIPickerView 不知道它显示的标题。提供标题是 UIPickerViewDataSource 的工作。

因此,不幸的是,如果您需要在 UI 测试中了解 UIPickerView 的所有行标题,您真的必须 select 通过您的应用程序的用户界面。

但它不必像您链接的答案中那样复杂。您可以简单地点击下一行以 select 它(应该稍微快一点),而不是模拟滚动:

let pickerView = app.pickerWheels.element
let numRows = pickerView.children(matching: .any).count
var values: [String] = [pickerView.value as! String]

for _ in 0..<numRows {
    pickerView.coordinate(withNormalizedOffset: CGVector(dx: 0.5, dy: 0.55)).tap()
    values.append(pickerView.value as! String)
}

在您的问题中,您并没有真正描述您要测试的内容。但是,如果您想测试选择器是否具有正确的行标题,也许 UnitTest 会是一种更实用的方法?