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()