Xcode 11: _XCTestCaseInterruptionException при использовании XCUIElement waitForExistence - PullRequest
2 голосов
/ 12 ноября 2019

В настоящее время я использую стандартную функцию XCUIElement waitForExistence (timeout: TimeInterval), чтобы дождаться появления кнопки. Я всегда устанавливал тайм-аут больше, чем 2,0 секунды, но продолжаю сталкиваться с одной и той же проблемой.

Ошибка подтверждения: не удалось получить совпадающие снимки: невозможно выполнить работу в главном цикле выполнения, обработать основной потокзанят для 2.0s - рекомендуем повторить попытку клиентом *** Завершение работы приложения из-за необработанного исключения «_XCTestCaseInterruptionException», причина: «Прерывающий тест»

Это так расстраивает, поскольку это начало происходить в Xcode 11 и выше,Хуже того, вы не можете поймать исключение, так как метод waitForExistence настроен так, чтобы никогда не вызывать исключение. Есть идеи как это поймать? Целевой элемент - это просто XCUIApplication (). Buttons ["id"], так что это должно быть хорошо для go. Пока приложение извлекает данные, не должно быть никакого отключения от основного потока.

1 Ответ

0 голосов
/ 25 ноября 2019

Я использую пользовательское ожидание в тестах пользовательского интерфейса, которое всегда работало (я создал расширение для XCTestCase):

public class var defaultTimeOut: TimeInterval { return 5 }

public func wait(forFulfillmentOf predicate: NSPredicate,
                 for element: XCUIElement,
                 withFailingMessage message: String = "Failed to fulfill predicate %@ for %@ within %.2f seconds.",
                 timeout: TimeInterval = XCTestCase.defaultTimeOut,
                 file: StaticString = #file,
                 line: UInt = #line) {

    expectation(for: predicate, evaluatedWith: element, handler: nil)

    waitForExpectations(timeout: timeout) { (error) -> Void in
        guard error != nil else {
            return
        }
        let failingMessage = String(format: message, arguments: [predicate, element, timeout])
        self.recordFailure(withDescription: failingMessage, inFile: String(describing: file), atLine: Int(clamping: line), expected: true)
    }
}

Затем вы можете использовать этот метод в тестах пользовательского интерфейса:

public func wait(forExistanceOf element: XCUIElement, timeout: TimeInterval = XCTestCase.defaultTimeOut, file: StaticString = #file, line: UInt = #line) {
    let existancePredicate = NSPredicate(format: "exists == true")
    wait(forFulfillmentOf: existancePredicate, for: element, withFailingMessage: "Failed to find %2$@ within %3$.2f seconds. Predicate was: %1$@.", timeout: timeout, file: file, line: line)
}

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...