Xcuitest - Как я могу дождаться завершения загрузки изображения - PullRequest
0 голосов
/ 13 июля 2020

Я запускаю свои UiTests в приложении, которое использует изображения / видео из камеры / фото Google / Et c ..

Все изображения / видео находятся в CollectionView, и каждый ресурс находится в Speci c cell.

Когда приложение открывает «экран видеоряда», оно содержит 15 ресурсов одновременно, и я пытаюсь создать функцию, которая ждет, пока все изображения не закончатся sh до load.

Зачем мне это нужно: у меня есть тесты, которые выбирают изображения / видео, и иногда Xctest может выбрать первый, потому что не все ресурсы заканчиваются sh загрузка.

Примечание : У меня нет никаких указаний на то, что «все ресурсы завершены sh для загрузки».

Есть предложения?

Ответы [ 3 ]

1 голос
/ 14 июля 2020
  • Вы должны проверить свой app.debugDescription до и после загрузки. Найдите все, что можно проверить асинхронно.

  • При необходимости добавьте идентификаторы доступности в код приложения, которые отличаются до / после загрузки. Вам также следует добавить несколько меток доступности, чтобы помочь пользователям VoiceOver и VoiceControl взаимодействовать с вашим приложением.

  • Вы можете использовать SUITCase для тестирования снимков экрана и ожидания. https://github.com/devexperts/suitcase/

  • Вы можете добавить несколько утверждений EarlGrey 2. Эта среда тестирования немного более гибкая и автоматически ожидает операций asyn c. Хорошо, что вы можете использовать его вместе с существующими тестами XCTest.

  • Наконец, вы можете просто sleep(5): D

0 голосов
/ 16 июля 2020

В XCTest фреймворке есть метод ожидание для тестирования асинхронной работы.

ожидание

Использование этот метод для создания экземпляров XCTestExpectation, которые могут быть выполнены после завершения асинхронных задач в ваших тестах.

Вы можете создать функцию для использования предсказания существования, как показано ниже:

// create a function to wait for prediction
func waitNotExistance(for element: XCUIElement, timeout: Double = 5) {
    let notExists = NSPredicate(format: "exists != 1")
    let elementShown = expectation(for: notExists, evaluatedWith: element)
    wait(for: [elementShown], timeout: timeout, enforceOrder: false)
}

Предположим, что вы установили accessibilityIdentifier « загрузка » в качестве начального значения и « загружено » после завершения. Вы можете дождаться их отсутствия.

Использование :

// your loading cell
let ladingElement = app.collectionViews.element(boundBy: 0).cells.matching(identifier: "loading").element

// wait until timeout reached 
waitNotExistance(for: ladingElement)

// assert here what you expect..
0 голосов
/ 16 июля 2020

Второе предложение решает проблему:

Я добавил идентификаторы доступности к ячейкам, содержащим изображения 1: когда изображение все еще загружается «selectFootageCellImageEmpty» 2. Когда изображение завершает загрузку «selectFootageCellImageLoaded «А теперь я жду, пока на экране не будет« selectFootageCellImageEmpty », например:

        let endOfLoop = Date().addingTimeInterval(TimeInterval(10))
        while app.collectionViews.element(boundBy: 2).cells.matching(identifier: "selectFootageCellImageEmpty").element.exists {
        sleep(1)
        print("Waiting for all images to finish loading")
        if Date() > endOfLoop {
            break
        }
    }
  • Я мог бы добавить XCTAssert вместо строки« break », но он мне не нужен момент.
...