XCTestCase: Подождите, пока приложение перестанет работать

Мой UI-тест терпит неудачу, потому что тест ждет бесконечного, пока приложение не простаивает. Я не вижу, что в фоновом режиме что-то происходит, как загрузчик.

Это просто происходит на одной вкладке. Все остальные вкладки можно распечатать, но тест не работает на экране 3. Я нажимаю на другую вкладку после того, как тест пойман на экране 3, тест возобновляется и заканчивается успешно.

Любые идеи?

- (void)testExample
{

    XCUIElementQuery* tabBarsQuery = self.app.tabBars;

    [tabBarsQuery.buttons[@"Screen2"] tap];
    [tabBarsQuery.buttons[@"Screen3"] tap];
    [tabBarsQuery.buttons[@"Screen1"] tap];
    [tabBarsQuery.buttons[@"Screen4"] tap];

}

Ответ 1

Возможно, у вас есть анимация или какая-либо другая фоновая (или передняя) активность, которая часто обновляет ваш пользовательский интерфейс на основном потоке. Это приводит к тому, что приложение никогда не будет "quiesce" - по крайней мере, на этой вкладке. В нашем приложении у нас была анимация UIView с опцией Repeat. Использование ЦП было прекрасным, и это не было утечкой батареи, но каждый раз он терпел неудачу. Исправлена ​​проблема с отключением анимации. Я не мог найти способ заставить тест не ждать, пока он будет бездействующим, поэтому мы закончили отключать анимацию , используя #ifdef для цели тестирования пользовательского интерфейса, используя аргументы среды выполнения, как описано здесь: fooobar.com/questions/295003/...

Ответ 2

let tabBarsQuery = self.app.tabBars
let button = tabBarsQuery.buttons[@"Screen2"]

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

let predicate = NSPredicate(format: "isHittable == 1") expectation(for: 
predicate, evaluatedWith: button, handler: nil)
waitForExpectations(timeout:10, handler: nil)
button.tap()