В моем приложении для Android есть кнопка для загрузки файла и отправки его в приложение на устройстве. Android открывает экран со списком приложений на устройстве, чтобы пользователь мог выбрать, какое приложение использовать.
Я хотел бы автоматизировать этот поток, но я не вижу, как я могу автоматизировать нажатие на средство выбора приложений, которое представляет Android. Я предполагаю, что это потому, что это вне моего приложения.
Я попытался использовать «Record Expresso Test» Android Studio, я выполнил следующие шаги теста.
- нажмите на действие, которое отправляет мое изображение в приложение на устройстве (action1)
- увидел окно выбора приложений для Android и выбрал фотографии
- Нажал назад, чтобы закрыть приложение для фотографий и вернуться в мое приложение.
- нажмите на другое действие в моем приложении (action2)
Я вижу в записанном тестовом коде шаги 1 и 4 выше, но ничего для 2 и 3. Поэтому я думаю, что Expresso нельзя использовать для этого конкретного потока тестирования.
Кто-нибудь знает, как я могу протестировать этот поток с помощью Expresso?
ИЗМЕНИТЬ:
Спасибо "Джону О'Рейли" за рекомендацию UI Automator. Я вижу, что могу успешно использовать код UI Automator в своем тесте Expresso. Однако у меня возникли проблемы с написанием точной проверки селектора приложений.
Селектор будет иметь название «Открыть с помощью». Используя Android Device Monitor, я вижу иерархию объектов, как показано ниже.
Некоторые классы и идентификаторы являются внутренними, поэтому я не могу их искать. Я не хочу, чтобы код искал конкретное приложение, поскольку, когда тест запускается на другом компьютере, у него может не быть этого приложения. Мне просто нужно убедиться, что средство выбора приложений отображается.
// the app selector has a FrameLayout as one of its parent views, and a child Text View which has the "Open With" title
UiObject labelOnly = new UiObject(new UiSelector()
.className("android.widget.FrameLayout")
.childSelector(new UiSelector()
.className("android.widget.TextView")
.text(openWithLabel)
)
);
boolean labelOnly_exists = labelOnly.exists();
// the app selector has a FrameLayout as one of its parent views, and a child ListView (containing the apps)
UiObject listOnly = new UiObject(new UiSelector()
.className("android.widget.FrameLayout")
.childSelector(new UiSelector()
.className("android.widget.ListView")
)
);
boolean listOnly_exists = listOnly.exists();
// I can use the listView to search for a specific app, but this makes the tests fragile if a different device does not have that app installed
UiObject listAndAppName = new UiObject(new UiSelector()
.className("android.widget.ListView")
.instance(0)
.childSelector(new UiSelector()
.text("Photos")));
boolean listAndAppName_exists = listAndAppName.exists();
Как я могу написать оператор, который проверяет, что то, что находится на экране, является средством выбора приложений? Я надеялся, что у меня есть селектор, который ищет FrameLayout, у которого есть дочерний textView, содержащий «Открыть с», а также содержащий дочерний ListView. Вместе с этими двумя проверками он должен идентифицировать только средство выбора приложений.