Ответ 1
Добавить
app.tap()
в конце метода.
Это связано с тем, что вам нужно взаимодействовать с приложением для обработчика.
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
}
}
и это не работает для:
В начале приложения он отлично работает при разрешении на получение уведомлений, но здесь... не работает.
Знаете ли вы, почему?
Добавить
app.tap()
в конце метода.
Это связано с тем, что вам нужно взаимодействовать с приложением для обработчика.
После добавления монитора прерывания вы должны продолжать взаимодействовать с приложением, как будто он не появился.
Также обратите внимание, что у вас есть "умная цитата" в вашем идентификаторе кнопки, вместо обычного апострофа.
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 handler will be invoked if the alert is present
Когда следующее взаимодействие произойдет после появления предупреждения, обработчик монитора прерывания будет вызван и будет обработано предупреждение.
Вы также должны удалить монитор прерывания, если считаете, что с ним все поработали, иначе он будет вызываться для любых других предупреждений, которые появляются.
removeUIInterruptionMonitor(photosAlertHandler)
Я обнаружил, что addUIInterruptionMonitor иногда не обрабатывает предупреждение вовремя или до завершения тестов. Если это не работает, попробуйте использовать Springboard, который управляет домашним экраном iOS. Оттуда вы можете получить доступ к оповещениям, кнопкам и многим другим, и это особенно полезно для тестов, в которых вы точно знаете, когда появится оповещение.
Итак, что-то вроде этого:
'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"
вызывает проблему).