Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

XСTests на Swift. Как создать неявные ожидания?

xctest
swift
mobile
Теги: #<Tag:0x00007f7b617b2b20> #<Tag:0x00007f7b617b29e0> #<Tag:0x00007f7b617b28a0>

(Сергей Семенов) #1

Доброго всем времени, решил попробовать свои силы в автоматизации ios приложений с помощью яп Swift и XCode, столкнулся с проблемой создания неявных ожиданий. Кейс для примера:

  1. Запуск приложения (Пока приложение загружается - крутится прелоадер)
  2. Появляются поля ввода логина и пароля.

Для ожидания загрузки полей получается использовать явные ожидания Thread.sleep, а вот неявных не смог найти, возможно кто-то уже сталкивался:

public func sleep(timeForSleep: Int) -> Void {
Thread.sleep(forTimeInterval: TimeInterval(timeForSleep));
}
public func tap(element: XCUIElement) -> Void{
element.tap();
}


(Aleksey Ilyenko) #2

Apple недавно добавили полноценную поддержку ожиданий в XCTest. В коде это выглядит приблизительно так:

func waitFor(_ element: XCUIElement, _ predicateString: String) {
    let expectation = XCTNSPredicateExpectation(predicate: NSPredicate(format: predicateString), object: element)
    let time = 10.0
    let result = XCTWaiter().wait(for: [expectation], timeout: time)
    if result != .completed {
        XCTFail("Condition '\(predicateString)' for \(element) was not satisfied during \(time) seconds")
    }
}

Затем можно создавать ожидания разных условий с помощью предикатов. Например:

func waitUntilVisible(_ element: XCUIElement) {
    return waitFor(element, "exists == true")
}

или

func waitUntilFocused(_ element: XCUIElement) {
    return waitFor(element, "hasFocus == true")
}

(Сергей Семенов) #3

спасибо за помощь, обязательно попробую и отпишусь!


(Viktor Vladimirovich) #4

Хорошее решение