addUIInterruptionMonitor(withDescription:handler:) не работает на iOS 10 или 9
Следующие тесты отлично работают на iOS 11. Он отклоняет предупреждение, запрашивающее разрешения на использование сервисов определения местоположения, а затем увеличивает масштаб на карте. На iOS 10 или 9 это не делает ничего, и тест все еще успешно
func testExample() {
let app = XCUIApplication()
var handled = false
var appeared = false
let token = addUIInterruptionMonitor(withDescription: "Location") { (alert) -> Bool in
appeared = true
let allow = alert.buttons["Allow"]
if allow.exists {
allow.tap()
handled = true
return true
}
return false
}
// Interruption won't happen without some kind of action.
app.tap()
removeUIInterruptionMonitor(token)
XCTAssertTrue(appeared && handled)
}
У кого-нибудь есть идея, почему и / или обходной путь?
Вот проект, в котором вы можете воспроизвести проблему: https://github.com/TitouanVanBelle/Map
Обновить
Изменения в Xcode 9.3 Beta показывают следующее
XCTest UI interruption monitors now work correctly on devices and simulators running iOS 10. (33278282)
3 ответа
let springboard = XCUIApplication(bundleIdentifier: "com.apple.springboard")
let allowBtn = springboard.buttons["Allow"]
if allowBtn.exists {
allowBtn.tap()
}
У меня была эта проблема, и решение River2202 сработало для меня.
Обратите внимание, что это не исправление, заставляющее UIInterruptionMonitor работать, а другой способ отклонения оповещения. Вы также можете удалить установку addUIInterruptionMonitor. Вам нужно будет иметь springboard.buttons["Allow"].exists
проверить везде, где может появиться предупреждение о разрешении. Если возможно, сделайте так, чтобы оно появилось на ранней стадии тестирования, чтобы вам больше не пришлось беспокоиться об этом позже.
Счастливо springboard.buttons["Allow"].exists
код по-прежнему работает в iOS 11, поэтому вы можете иметь один путь к коду и не выполнять одно действие для iOS 10, а другое для iOS 11.
Кстати, я зарегистрировал проблему с базой (что addUIInterruptionMonitor не работает до iOS 11) как ошибку с Apple. Он был закрыт как дубликат, поэтому, я думаю, они признают, что это ошибка.
Я использовал решение @River2202, и оно работает лучше, чем решение с прерыванием. Если вы решите использовать это, я настоятельно рекомендую вам использовать функцию официанта. Я создал этот, чтобы ждать появления любого элемента XCUIE:
Попытайся!
// function to wait for an ui element to appear on screen, with a default wait time of 20 seconds
// XCTWaiter was introduced after Xcode 8.3, which is handling better the timewait, it's not failing the test. It uses an enum which returns: 'Waiters can be used with or without a delegate to respond to events such as completion, timeout, or invalid expectation fulfilment.'
@discardableResult
func uiElementExists(for element: XCUIElement, timeout: TimeInterval = 20) -> Bool {
let expectation = XCTNSPredicateExpectation(predicate: NSPredicate(format: "exists == true"), object: element)
let result = XCTWaiter().wait(for: [expectation], timeout: timeout)
guard result == .completed else {
return false
}
return true
}