Я думаю, что Apple ожидает от разработчика использования представленного addUIInterruptionMonitor .
На самом деле addUIInterruptionMonitor(withDescription: )
не работает, поэтому я пошел по дороге, чтобы получить доступ кТрамплин и выберите соответствующее разрешение в системном оповещении.
1.Расширен XCTestCase для повторного использования этой функции, если необходимо
extension XCTestCase {
// I hope this code is mostly reusable
// I didn't test it for Location Permission While in Use vs. Always...
func setPermission(for alert:XCUIElement, allow: Bool) -> Bool {
if alert.elementType == .alert {
// make sure to support any language
// Might also be "allow" for some dialogs
let buttonIdentifier = allow ? "Continue" : "Cancel"
let identifierButton = alert.buttons[buttonIdentifier]
if identifierButton.exists && identifierButton.isHittable {
identifierButton.tap()
return true
}
// Or, if you don't want to bother with the language/identifiers
// Allow = Last button Index (probably 1), Cancel = 0
let buttonIndex = allow ? alert.buttons.count - 1 : 0
let indexButton = alert.buttons.element(boundBy: buttonIndex)
if indexButton.exists && indexButton.isHittable {
indexButton.tap()
return true
}
}
return false
}
}
2.Вызовите эту функцию в своем тесте как
// This holds a reference to your SignIn/Login XCUIElement
yourSignInButton.tap()
let systemAlerts = XCUIApplication(bundleIdentifier: "com.apple.springboard").alerts
if systemAlerts.count > 0 {
_ = self.setPermission(for: systemAlerts.element(boundBy: 0), allow: true)
}
Необязательно: класс Springboard
Я также создал класс Springboard, так как у меня также есть тесты системных настроек и т. Д.. running ...
class Springboard {
static let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
}
Таким образом, вы можете назвать свой XCUITestCase
добавочный номер следующим образом:
let systemAlerts = Springboard.springboard.alerts
if systemAlerts.count > 0 {
self.setPermission(for: systemAlerts.element(boundBy: 0), allow: true)
}
Если addUIInterruptionMonitor(withDescription: )
действительно работалтогда это может выглядеть следующим образом:
Внимание: в настоящее время работает только для уведомлений о авторизации / разрешении местоположения, микрофона и т. д.
let interruptionMonitor = addUIInterruptionMonitor(withDescription: "Allow the app and website to share information") { (alert) -> Bool in
return self.setPermission(for: systemAlerts.element(boundBy: 0), allow: true)
}
// This holds a reference to your SignIn/Login XCUIElement
yourSignInButton.tap()
removeUIInterruptionMonitor(interruptionMonitor)