Тест пользовательского интерфейса 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()
}
}
}