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

时间:2017-02-17 21:22:48

标签: swift uipickerview xcode-ui-testing

最近我遇到了一个非常头痛的问题(而且我还在苦苦思索),想知道如何检索UIPickerWheel中的所有值。对我来说应该足够在特定的方向行,但我不能!真令人沮丧!我试图逐行滚动来检索所有值(https://stackoverflow.com/a/39300344/821407),但它太慢了!任何线索?

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

1 个答案:

答案 0 :(得分:2)

这可能不是您希望的答案,但是无法在UITest中获得UIPickerView中所有行的标题。

如您所知,在运行UITest时,您只能通过XCUIElement课程访问应用的UI元素。该类具有value属性,可为您提供有关您访问的UI元素的一些信息。访问UIPickerView时,value会为您提供当前所选行的标题。但只有选定的行。您可以访问选择器的行元素,但不幸的是,行元素的value属性始终为空。所以,这里没有运气。您可以获得的所有信息都是选择器的行数。

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

所以,不幸的是,如果您需要知道UITest中UIPickerView的所有行标题,您必须通过应用的用户界面逐个选择每个值。

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

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是否会更实用?