UI 测试 - 等待对话框,然后点击“确定”按钮并检查控制器

问题描述 投票:0回答:2

我正在尝试为我的控制器创建 UI 测试。我填充文本字段并点击按钮,现在我想等待对话框出现,当它出现时我想点击“确定”按钮并检查显示的控制器。

我的测试方法到此结束:

let alert = app.alerts["Error"]
let exists = NSPredicate(format: "exists == 1")
self.expectationForPredicate(exists, evaluatedWithObject: alert, handler: nil)
self.waitForExpectationsWithTimeout(5.0) { (error) in

  XCTAssertNil(error, "Something went horribly wrong")
  alert.buttons["Ok"].tap()
  XCTAssertEqual(app.navigationBars.element.identifier, "RegistrationViewController")
}

问题是测试被评估为失败,但当我查看手机时,会出现对话框,点击“确定”按钮,控制器也正常。

我在调试窗口中遇到此失败:

UI 测试失败 - 未找到警报匹配项

我猜那个水龙头有问题。我该如何修复它?我做错了什么?谢谢

ios swift alert xcode-ui-testing ui-testing
2个回答
8
投票

waitforExpectationsWithTimeout()
仅在超过超时时调用完成处理程序。只需将控制器断言移至异步等待调用下方即可。

let alert = app.alerts["Error"]
let exists = NSPredicate(format: "exists == 1")

expectation(for: exists, evaluatedWith: alert, handler: nil)
waitForExpectations(timeout: timeout, handler: nil)

alert.buttons["Ok"].tap()
XCTAssertEqual(app.navigationBars.element.identifier, "RegistrationViewController")

0
投票

警报对话框是系统警报,因此无法通过 app.alerts 访问。

要访问系统警报,您可以使用 SpringBoard 应用程序,如下所示:

 let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")

SpringBoard 应用程序中提供系统警报。您现在可以使用此方法访问该对话框。

springboard.buttons["Ok"]
© www.soinside.com 2019 - 2024. All rights reserved.