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];

}

person netshark1000    schedule 10.11.2015    source источник


Ответы (2)


Возможно, у вас есть какая-то анимация или какая-то другая фоновая (или передняя) активность, которая часто обновляет ваш пользовательский интерфейс в основном потоке. Это приводит к тому, что приложение никогда не «останавливается» — по крайней мере, на этой вкладке. В нашем приложении у нас была анимация UIView с опцией Repeat. Использование ЦП было в порядке, и это не привело к разрядке батареи, но каждый раз это приводило к провалу теста. Отключение анимации решило проблему. Я не смог найти способ заставить тест не ждать бездействия, поэтому в итоге мы отключили анимацию используя #ifdef для цели теста пользовательского интерфейса, используя аргументы времени выполнения, как описано здесь: https://stackoverflow.com/a/33466038/168996

person Kamil Nomtek.com    schedule 06.06.2016
comment
Странный. Должен быть способ заставить процесс тестирования игнорировать анимацию... анимация — это нормально в приложениях, не так ли? Анимации не должны иметь никакого значения для потока теста. То, что что-то движется, не означает, что нельзя нажать другую кнопку в пользовательском интерфейсе. - person Jonny; 22.12.2016
comment
Возможно, это была просто ошибка XCTest в какой-то более ранней версии. Я не уверен на 100%, но я думаю, что теперь это работает нормально, т. Е. Есть повторяющаяся анимация, но она не проходит тест. - person Kamil Nomtek.com; 20.04.2017

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()
person Ravi Tailor    schedule 21.05.2019
comment
Хотя этот код может решить проблему, включая объяснение того, как и почему это решает проблему, действительно поможет улучшить качество. вашего сообщения и, вероятно, приведет к большему количеству голосов. Помните, что вы отвечаете на вопрос для будущих читателей, а не только для того, кто задает сейчас. Пожалуйста, отредактируйте свой ответ, чтобы добавить пояснения и указать, какие ограничения и предположения применяются. - person Pika the Master of the Whales; 21.05.2019