不会为与照片相关的警报调用addUIInterruptionMonitor的处理程序

时间:2016-10-11 09:09:06

标签: ios swift xcode-ui-testing

private func acceptPermissionAlert() {

    _ = addUIInterruptionMonitor(withDescription: "") { alert -> Bool in

        if alert.buttons["Don’t Allow"].exists { //doesnt get here second time

            alert.buttons.element(boundBy: 1).tapWhenExists()

            return true
        }

        return false
    }
}

这不适用于:

enter image description here

在应用程序的开头,它在完成通知的acepting权限时工作正常,但这里......无效。

你知道为什么吗?

3 个答案:

答案 0 :(得分:13)

添加:

app.tap()

在方法结束时。

  

这是因为您需要与应用程序进行交互才能触发处理程序。

答案 1 :(得分:6)

添加中断监视器后,您应该继续与应用程序进行交互,就像它没有出现一样。

另请注意,您的按钮标识符中包含“智能引号”,而不是常规撇号。

let photosAlertHandler = addUIInterruptionMonitor(withDescription: "Photo Permissions") { alert -> Bool in
    if alert.buttons["Don't Allow"].exists {
        alert.buttons.element(boundBy: 1).tapWhenExists()
        return true
    }
    return false
}

// Do whatever you want to do after dismissing the alert
let someButton = app.buttons["someButton"]
someButton.tap() // The interruption monitor's handler will be invoked if the alert is present

当警报出现后发生下一次交互时,将调用中断监视器的处理程序并处理警报。

当您认为已经完成中断监视器时,您也应该将其移除,否则将针对出现的任何其他警报调用它。

removeUIInterruptionMonitor(photosAlertHandler)

答案 2 :(得分:5)

我发现addUIInterruptionMonitor有时无法及时处理警报,或者直到测试完成。如果不起作用,请尝试使用管理iOS主屏幕的Springboard。您可以从那里访问警报,按钮等,这对于您确切知道警报何时显示的测试特别有用。

所以,像这样:

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

let alertAllowButton = springboard.buttons.element(boundBy: 1)
if alertAllowButton.waitForExistence(timeout: 5) {
   alertAllowButton.tap()
}`

buttons.element(boundBy:1)将确保您点击右侧的按钮,将1更改为0以点击左侧,(因为有时"Don't Allow"中的'会引起问题)。