#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)
}