显示没有按钮的 UIAlertController 时 UI 测试失败

Posted

技术标签:

【中文标题】显示没有按钮的 UIAlertController 时 UI 测试失败【英文标题】:UI Testing Failure when displaying UIAlertController with no buttons 【发布时间】:2016-12-01 17:16:45 【问题描述】:

当网络请求发生时,我们使用UIAlertController 作为加载指示器。没有与此 UIAlertController 关联的操作,因为它会在网络活动完成时自动关闭。我们会在用户点击我们应用的登录按钮后显示此警报。

当我们运行我们的测试时,它们会在这之后立即失败:

UI Testing Failure - Did not receive view did disappear notification within 2.0s  

根据 SO 上的 other answers,我尝试使用 addUIInterruptionMonitor 来处理警报,但没有任何成功。我认为这是因为UIAlertController 上没有可操作的按钮。由于无法对警报执行任何操作,因此中断监视器如下所示:

addUIInterruptionMonitor(withDescription: "Loading")  handler in  
    return true  

即使这样,我也会遇到同样的错误。我该如何解决这个问题?

编辑:下面的相关 UI 测试代码:

class UI_Tests: XCTestCase 
    override func setUp() 
        super.setUp()

        continueAfterFailure = true

        XCUIApplication().launch()
    

    func testLogin() 
        let app = XCUIApplication()
        let tablesQuery = app.tables

        let secureTextField = tablesQuery.cells.containing(.staticText, identifier:"PIN").children(matching: .secureTextField).element
        secureTextField.tap()
        secureTextField.typeText("1234")

        app.buttons["Login"].tap()

        addUIInterruptionMonitor(withDescription: "Loading")  handler in
            return true
        

        // Test failure occurs here.

        let searchField = tablesQuery.searchFields.element(boundBy: 0)
        searchField.tap()
        searchField.typeText("hey")
    

【问题讨论】:

请出示您的 UI 测试代码! 内容不多,我一会儿再补充。 @matt 刚刚更新 你可以阅读这篇文章github.com/onmyway133/blog/issues/82 【参考方案1】:

联系 Apple DTS 后发现,当显示基于超时关闭的 UI 中断/UIAlertController 时,您需要将 UI 中断监视器与基于超时的期望结合起来(否则,中断监视器将在警报解除之前返回!)。

使用问题中的 UI 测试示例,这种方法如下所示:

class UI_Tests: XCTestCase 
    override func setUp() 
        super.setUp()

        continueAfterFailure = true

        XCUIApplication().launch()
    

    func testLogin() 
        let app = XCUIApplication()
        let tablesQuery = app.tables

        let secureTextField = tablesQuery.cells.containing(.staticText, identifier:"PIN").children(matching: .secureTextField).element
        secureTextField.tap()
        secureTextField.typeText("1234")

        app.buttons["Login"].tap()

        addUIInterruptionMonitor(withDescription: "Loading")  alert in
            self.expectation(for: NSPredicate(format: "exists == false"), evaluatedWith: alert, handler: nil);
            self.waitForExpectations(timeout: 10, handler: nil)
            return true
        

        // Test failure occurs here.

        let searchField = tablesQuery.searchFields.element(boundBy: 0)
        searchField.tap()
        searchField.typeText("hey")
    

此期望将等待 10 秒才能被填充。如果警报在 10 秒后没有解除,则无法满足预期,测试将失败,但如果满足,则测试将成功。

【讨论】:

以上是关于显示没有按钮的 UIAlertController 时 UI 测试失败的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 UIAlertController 不显示?

在 UIAlertController 之后重新加载视图

呈现的 UIViewController 不能呈现 UIAlertController

UIAlertController 按钮不可见

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

在UIAlertController中的操作下方显示空格