Обработчик addUIInterruptionMonitor не вызван для Alert, связанного с фотографиями

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
    }
}

и это не работает для:

введите описание изображения здесь

В начале приложения он отлично работает при разрешении на получение уведомлений, но здесь... не работает.

Знаете ли вы, почему?

Ответ 1

Добавить

app.tap()

в конце метода.

Это связано с тем, что вам нужно взаимодействовать с приложением для обработчика.

Ответ 2

После добавления монитора прерывания вы должны продолжать взаимодействовать с приложением, как будто он не появился.

Также обратите внимание, что у вас есть "умная цитата" в вашем идентификаторе кнопки, вместо обычного апострофа.

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)

Ответ 3

Я обнаружил, что 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" вызывает проблему).