Тест пользовательского интерфейса X Code Как обрабатывать разрешения на уведомления, генерируемые UNUserNotificationCenter

В моем приложении я спрашиваю разрешения уведомлений, как это:

      UNUserNotificationCenter.current().requestAuthorization(options:[.badge, .alert, .sound]) { (granted, error) in

            if granted {
                DispatchQueue.main.async {
                    UIApplication.shared.registerForRemoteNotifications()
                }
            }
        }

Теперь во время тестирования мне нужно обработать это разрешение, но оно не работает, я попробовал этот код:

XCUIApplication().alerts["“AppName” Would Like to Send You Notifications"].buttons["Allow"].tap() //didn't work.

addUIInterruptionMonitorWithDescription("Notification Dialog") { (alert) -> Bool in  
    alert.buttons["Allow"].tap()
    return true
}


addUIInterruptionMonitorWithDescription("“AppName” Would Like to Send You Notifications") { (alert) -> Bool in  
    alert.buttons["Allow"].tap()
    return true
}


addUIInterruptionMonitorWithDescription("Notifications may include alerts, sounds, and icon badges. These can be configured in Settings.") { (alert) -> Bool in  
    alert.buttons["Allow"].tap()
    return true
}

Но ничего не работает.

3 ответа

Попробуй это

          let app2 = XCUIApplication(bundleIdentifier: "com.apple.springboard")
    let button = app2.alerts.firstMatch.buttons["Allow"]
    button.waitForExistence(timeout: 10)
    button.tap()

1/ Попробуйте записать путь с помощью тестового регистратора XCode для кнопки оповещения и убедитесь, что вы выбрали правильный путь.

XCUIApplication().alerts["“AppName” Would Like to Send You Notifications"].buttons["Allow"].tap() //didn't work.

может быть не правильно.

(примечание: использование тестового регистратора для таких вещей, как поиск пути к элементу - это нормально и очень удобно для новичков.)

2 / Вам не нужно использовать addUIInterruptionMonitorWithDescription в случае, если у вас есть системное оповещение, которое будет появляться каждый раз, или если вы знаете, что это произойдет. Просто используйте waitForExistance и нажмите на него, если он существует.

(примечание: я обнаружил, что ожидание и прослушивание системных уведомлений лучше, чем addUIInterruptionMonitorWithDescriptionчто нестабильно / сложно иногда)

3 / alert.buttons["Allow"].tap() не кажется мне правильным, не так ли XCUIApplication().alerts.buttons["Allow"]? Кроме того, вы можете использовать XCUIApplication().alerts.buttons.element(boundBy: 0 нажать на первую кнопку.

import XCTest

// For multiple permission requests
var isPhotoPermissionAvailable: Bool?
var isLocationPermissionAvailable: Bool?
var isNotificationsPermissionAvailable: Bool?

extension XCTestCase {

    func allowPhotos(_ enabled: Bool = true) {
        addUIInterruptionMonitor(withDescription: "Photo Permissions") { (alert) -> Bool in
            isPhotoPermissionAvailable = enabled
            var alertButton = alert.buttons["Don't Allow"]
            if enabled == true {
                alertButton = alert.buttons["OK"]
            }
            if alertButton.exists {
                alertButton.tap()
                return true
            }
            XCUIApplication().tap()
            return false
        }
        if isPhotoPermissionAvailable == nil {
            XCUIApplication().swipeUp() //with this code, alert.buttons["OK"] exsists
        }
    }

    func allowLocation(_ enabled: Bool = true) {
        addUIInterruptionMonitor(withDescription: "Location Dialog") { (alert) -> Bool in
            isLocationPermissionAvailable = enabled
            var alertButton = alert.buttons["Don't Allow"]
            if enabled == true {
                alertButton = alert.buttons["Always Allow"]
            }
            if alertButton.exists {
                alertButton.tap()
                return true
            }
                XCUIApplication().tap()
            return false
        }
        if isLocationPermissionAvailable == nil {
            XCUIApplication().swipeUp()
        }
    }

    func allowNotifications(_ enabled: Bool = true) {
        addUIInterruptionMonitor(withDescription: "Notification Dialog") { (alert) -> Bool in
            isNotificationsPermissionAvailable = enabled
            var alertButton = alert.buttons["Don't Allow"]
            if enabled == true {
                alertButton = alert.buttons["Allow"]
            }
            if alertButton.exists {
                alertButton.tap()
                return true
            }
            XCUIApplication().tap()
            return false
        }
        if isNotificationsPermissionAvailable == nil {
            XCUIApplication().swipeUp()
        }
    }
}
Другие вопросы по тегам