Как проверить состояние приложения в Swift UI Test

Некоторый фон

В настоящее время я пишу UI Test для панели настроек и нажимаю на кнопки, чтобы включить определенные разрешения, такие как push-уведомления и службы определения местоположения.

Однако, если предупреждение о разрешении было отображено ранее (независимо от того, разрешил ли пользователь доступ к разрешению или запретил его), предупреждение больше не будет отображаться и просто приведет пользователя к приложению настроек. К сожалению, эти настройки не сбрасываются, то есть при первом запуске тестов пользовательского интерфейса отображаются предупреждения; и во всех последующих тестовых запусках пользовательского интерфейса кнопки приведут меня к приложению настроек, если я не выполню сброс устройства до начала испытаний.

Моя проблема

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

if app.state == background {
    foregroundApp()
}

// continue with other tests 

Есть ли способ определить, находится ли приложение в фоновом режиме?

Что я пробовал

Я исследовал методы, чтобы определить состояние приложения (работает / фон / и т. Д.) Из теста пользовательского интерфейса, и не смог найти много. Я попытался проверить, существуют ли определенные элементы:

if (app.navigationBars.element.exists) ...

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

Я пытался использовать некоторые методы из частных заголовков Facebook для XCUIApplication() а также XCUIElement(),

XCUIApplication().state всегда возвращается 3 независимо от того, в каком состоянии находится приложение, и любые попытки вызова XCUIApplication().resolve() на переднем плане приложение выдает мне те же ошибки, что и раньше [1]

Я пытался переписать логику для приоритетного приложения, прежде чем возобновить тесты, но такие методы, как XCUIApplication().launch() убить приложение перед перезапуском, что я не могу сделать. Мне кажется, работает только служба siri, но я не могу получить доступ к службе siri через корпоративный прокси, и изменение разрешений прокси невозможно.

Есть ли другой способ проверить состояние приложения?

ошибки

[1] Эта ошибка печатается каждый раз, когда я пытаюсь сделать что-то, связанное с состоянием. Я не звоню snapshotView в любом месте, и, следовательно, предложение использовать afterScreenUpdates бесполезно.

Failure to get snapshot within 15.0s
Cannot snapshot view (<UIKeyboardImpl: 0x7febcc75d000; frame = (0 0; 
  414 226); layer = <CALayer: 0x608000625720>>) with 
  afterScreenUpdates:NO, because the view is not in a window. Use 
  afterScreenUpdates:YES.`

ТЛ; др

Мне нужно проверить, вошло ли приложение, которое я тестирую, в фоновый режим (т. Е. Пользователь нажал кнопку "Домой"). Проверка на наличие определенных элементов, таких как панели навигации, не работает, как и большинство методов из частных заголовков Facebook для XCUIApplication/XCUIElement. Приоритизация приложения также вызывает проблемы, и перезапуск приложения не вариант; ни Сири службы.

1 ответ

Решение

Вы можете сделать это в Swift 4, используя XCUIApplication.state, которая даст вам информацию о состоянии приложения - будь то на переднем плане или на заднем плане и т. д., однако, невозможно найти эту информацию в Swift 3 и ниже. По сути, тестирование пользовательского интерфейса в Swift 3 не поддерживает выход из приложения.

Другие вопросы по тегам