iOS UI测试:如何获取UIAlert

时间:2015-11-12 09:13:35

标签: ios xcode7 xcode-ui-testing

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

我正在尝试在UI测试中对此逻辑进行建模,并希望断言UIAlert正在显示正确的消息。但是,我找不到一种方法让UI Test访问Alert的message属性。这是测试记录器生成的代码:

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()
}

无论如何我可以提取UIAlert消息字符串的值,所以我可以对它进行断言吗?

3 个答案:

答案 0 :(得分:18)

You can't directly test the alert's message. You can, however, test if the alert contains your error message's copy (at all).

For example, say your alert looks like this:

Alert titled "You won!" with a message "Final Score: 27-25".

To assert that the alert contains the "Final Score" message, use:

XCTAssert(app.alerts.element.staticTexts["Final Score: 27 - 25"].exists)

You can also test the title of the alert directly:

XCTAssertEqual(app.alerts.element.label, "You won!")

More examples available in my UI Testing Cheat Sheet and Examples post and sample app.

答案 1 :(得分:1)

除了上面我一直努力工作的答案之外,还有另一种方法。

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

var alertPressed = false

然后添加一个UIInterruptionMonitor并将其布尔值设置为true:

addUIInterruptionMonitor(withDescription: "System Dialog") {
        (alert) -> Bool in
        alert.buttons["Allow"].tap()
        alertPressed = true
        return true
    }

然后再次与该应用进行交互,并断言布尔是真的

app.tap()
XCTAssert(alertPressed)

我希望这对某人有帮助。

答案 2 :(得分:0)

I think it is: alert.elements()[2].name() Inside onAlert callback function add alert.logElementTree() to see AlertView elements. It might be nil, maybe just title is shown.