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
}
}
这不适用于:
在应用程序的开头,它在完成通知的acepting权限时工作正常,但这里......无效。
你知道为什么吗?
答案 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"
中的'会引起问题)。