Невозможно выбрать изображение из gallery XCUITest

#ios #swift #xcode #xcuitest

#iOS #swift #xcode #xcuitest

Вопрос:

Я использую XCUITest для тестирования приложения, которое позволяет пользователю выбирать аватар, выбирая фотографию из галереи. Когда я нажимаю на кнопку, которая открывает окно галереи, я вижу элементы в debugDescription. Существует таблица, которая содержит папки с фотографиями. Проблема в том, что когда я впервые нажимаю на любую ячейку, тест завершается с ошибкой:

 Assertion Failure: UserProfileAndSettingsTests.swift:434: Failed to get matching snapshot: No matches found for Element at index 2 from input {(
    Table
)}".  
  

Если я поставлю там точку останова, при втором нажатии на любую ячейку это сработает.

Команда выглядит следующим образом:

 XCUIApplication().tables.element(boundBy: 2).cells.element(boundBy: 1).tap()
  

Если перед командой я помещаю строку: XCUIApplication().tables.element(boundBy: 2).cells.element(boundBy: 1) , она не завершается ошибкой. При попытке это не удается tap() .

Ответ №1:

Похоже, проблема со временем. Ознакомьтесь с XCUIElement классом, в частности с этим:

 /** Waits the specified amount of time for the element's exist property to be true and returns false if the timeout expires without the element coming into existence. */
    open func waitForExistence(timeout: TimeInterval) -> Bool
  

Вы должны быть в состоянии сделать что-то вроде этого:

 let element = XCUIApplication().tables.element(boundBy: 2).cells.element(boundBy: 1)
if element.waitForExistence(timeout: 2) {
   element.tap()
}
  

Я рекомендую подружиться с этим методом, а также с другими подобными методами и ожиданиями, чтобы иметь возможность делать подобные удобные вещи ( self в данном контексте это XCTestCase):

 func waitUntilTappable(_ element:XCUIElement, timeout: TimeInterval = 2) {
   let tappableExpectation = self.expectation(for: NSPredicate(format: "isHittable == true"),
                                                        evaluatedWith: element)
   self.wait(for: [tappableExpectation], timeout: timeout.rawValue)
}