iOS UI测试:如何获取UIAlertController的消息

iOS UI测试:如何获取UIAlertController的消息,ios,xcode7,xcode-ui-testing,Ios,Xcode7,Xcode Ui Testing,我的应用程序有一个登录屏幕。如果用户按下登录按钮而未在用户名或密码字段中输入任何文本,应用程序将显示带有错误消息的UIAlertController 我试图在UI测试中对此逻辑进行建模,并希望断言UIAlertController正在显示正确的消息。但是,我找不到UI测试访问警报消息属性的方法。以下是测试记录器生成的代码: func testLoginWithoutPasswort() { let app = XCUIApplication() let emailTextFiel

我的应用程序有一个登录屏幕。如果用户按下登录按钮而未在用户名或密码字段中输入任何文本,应用程序将显示带有错误消息的
UIAlertController

我试图在UI测试中对此逻辑进行建模,并希望断言
UIAlertController
正在显示正确的消息。但是,我找不到UI测试访问警报消息属性的方法。以下是测试记录器生成的代码:

func testLoginWithoutPasswort() {
    let app = XCUIApplication()
    let emailTextField = app.textFields["email"]
    emailTextField.tap()
    emailTextField.typeText("xxx@gmail.com")
    app.buttons["Login"].tap()
    app.alerts["Error"].collectionViews.buttons["OK"].tap()
}

是否有任何方法可以提取警报消息的
字符串
值,以便对其进行断言?

我认为是:
alert.elements()[2].name()

onAlert
回调函数中添加
alert.logElementTree()
以查看AlertView元素。可能是零,可能只是显示标题

您不能直接测试警报消息。但是,您可以测试警报是否包含错误消息的副本

例如,假设您的警报如下所示:

要断言警报包含“最终分数”消息,请使用:

XCTAssert(app.alerts.element.staticTexts["Final Score: 27 - 25"].exists)
您还可以直接测试警报的标题:

XCTAssertEqual(app.alerts.element.label, "You won!")
我的文章和文章中提供了更多的例子


除了上面的答案,还有另一种方法,我很难找到答案

在UItest方法中创建一个错误的布尔值:

var alertPressed = false
然后添加UIInterruptionMonitor,并在其闭包内将布尔设置为true:

addUIInterruptionMonitor(withDescription: "System Dialog") {
        (alert) -> Bool in
        alert.buttons["Allow"].tap()
        alertPressed = true
        return true
    }
然后再次与应用程序交互,并断言Bool为真

app.tap()
XCTAssert(alertPressed)

我希望这对某人有所帮助。

这个答案与最初的问题无关。