如何对 UIProgressView 进行 UITest?

How to UITest UIProgressView?

情况:

我想UI-测试我的进度视图,看看它的进度是否增加了。

我试过的:

通过在我的 UI-test 中使用断点并使用 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 returns 是正确的。

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

问题:

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

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

使用值 属性(当转换为字符串时)现在以某种方式工作。因为我想检查进度是否随时间增加,所以我剥离了字符串以获取其中的数字进度以进行比较。这是我现在使用的解决方案:

// 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)

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 查询(请参阅上面代码中的注释)