如何UITest UIProgressView?

时间:2017-09-21 13:04:46

标签: ios xcode xcode-ui-testing ui-testing uiprogressview

情况:

我想用UI测试我的进度视图,看看它的进度是否有所增加。

我尝试了什么:

通过在我的UI测试中使用断点并使用po print(app.debugDescription),我可以成功查看和访问UIProgressView元素。

它被称为: Other, 0x6080003869a0, traits: 8589935104, {{16.0, 285.5}, {343.0, 32.0}}, identifier: 'progressView', label: 'Progress', value: 5%

我使用let progressView = secondTableViewCell.otherElements["progressView"]访问它,因为.exists返回true。

现在,为了检查进度,上面的描述提示“value”属性,目前为5%。但是,当我尝试progressView.value as! String或Double或其中任何一个时,我似乎无法获得该属性,因为它不符合NSCoder。

问题:

是否可以对UIProgressView进行UI测试并使用它的进度值?

我的最终自定义解决方案:

使用value属性(当转换为String时)现在以某种方式工作。由于我想检查进度是否随着时间的推移而增加,我将删除String以获取其中的数字进度以进行比较。这是我现在使用的解决方案:

// Check if progress view increases over time
let progressView = secondTableViewCell.otherElements["progressView"]
XCTAssert(progressView.exists)

let progressViewValueString = progressView.value as! String
// Extract numeric value from '5%' string
let progressViewValue = progressViewValueString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()

// Let progress increase
sleep(3)

let newProgressViewValueString = progressView.value as! String
let newProgressViewValue = newProgressViewValueString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined()
XCTAssert(newProgressViewValue > progressViewValue)

1 个答案:

答案 0 :(得分:1)

XCUIElement 符合 XCUIElementAttributes ,可让您访问value类型的Any?属性

运行时value的实际类型取决于您要查询的UI元素类型。对于UIProgressView,它的类型为__NSCFString,它是NSString的具体子类。这意味着您可以安全地将其投射到String

这样做(假设你将进度视图的可访问性标识符设置为“progressView”):

func testProgressView() {
   let app = XCUIApplication()
   app.launch()

   let progressView = app.progressIndicators["progressView"]
   // alternative (if the above query does not work):
   // let progressView = app.otherElements["progressView"]
   let currentValue = progressView.value as? String
   XCTAssertEqual(currentValue, "5 %")
}

奇怪的是,在某些情况下progressIndicator查询不起作用。在这种情况下,您可以尝试otherElements查询(请参阅上面代码中的评论)