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
}
Другие вопросы по тегам