Xcode 7 UI测试:解除推送和位置警报

Tho*_*EVY 31 xcode ios swift xcode-ui-testing

我遇到了Xcode 7 UI测试的问题.

我的用户登录后,应用程序会显示两个警报,即请求位置警报和推送通知警报.这些通知一个接一个地显示.位置一出现在第一位.

我尝试自动解雇它们以开始我的测试.

为此,我添加了两个UIInterruptionMonitor,第一个用于Location Alert,第二个用于Notification Push Alert.

    addUIInterruptionMonitorWithDescription("Location Dialog") { (alert) -> Bool in
        /* Dismiss Location Dialog */
        if alert.collectionViews.buttons["Allow"].exists {
            alert.collectionViews.buttons["Allow"].tap()
            return true
        }
        return false
    }
    addUIInterruptionMonitorWithDescription("Push Dialog") { (alert) -> Bool in
        /* Dismiss Push Dialog */
        if alert.collectionViews.buttons["OK"].exists {
            alert.collectionViews.buttons["OK"].tap()
            return true
        }
        return false
    }
Run Code Online (Sandbox Code Playgroud)

但只触发Location 1,从不调用Push Notifications UIInterruptionMonitor的处理程序.

如果我在返回true 请求位置 UIInterruptionMonitor因为这等后接受的答案指定.两个处理程序都被调用,但两个UIInterruptionMonitor中alert参数都链接到请求位置警报视图,因此永远找不到"确定"按钮.

如何解除这两个连续的警报视图?

Dav*_*eck 10

虽然不理想,但我发现如果您只是等到一个授权对话框完成后再在应用程序中显示另一个授权对话框,则UI测试可以连续获取多个请求.

    if CLLocationManager.authorizationStatus() == .AuthorizedWhenInUse || CLLocationManager.authorizationStatus() == .AuthorizedAlways {
        self.locationManager.requestLocation()
    } else {
        self.contactStore.requestAccessForEntityType(.Contacts) { _ in
            self.locationManager.requestWhenInUseAuthorization()
        }
    }
Run Code Online (Sandbox Code Playgroud)

我实际上是在我的代码中请求访问不同位置的联系人,但它可以处理多个同时请求.

然后在我的测试中:

    addUIInterruptionMonitorWithDescription("Location Dialog") { (alert) -> Bool in
        let button = alert.buttons["Allow"]
        if button.exists {
            button.tap()
            return true
        }
        return false
    }
    addUIInterruptionMonitorWithDescription("Contacts Dialog") { (alert) -> Bool in
        let button = alert.buttons["OK"]
        if button.exists {
            button.tap()
            return true
        }
        return false
    }

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

    app.tap() // need to interact with the app for the handler to fire
    app.tap() // need to interact with the app for the handler to fire
Run Code Online (Sandbox Code Playgroud)


Joe*_*tti 3

正如我在您提到的答案中指出的那样,您必须在警报出现后与应用程序进行交互。

其次,呈现警报后,您必须与界面进行交互。只需点击应用程序即可正常工作,但这是必需的。

// add UI interruption handlers

app.buttons["Request Location"].tap()
app.tap() // need to interact with the app for the handler to fire
Run Code Online (Sandbox Code Playgroud)