Android Expresso/UI Automator Как автоматизировать нажатие на экраны Android вне моего приложения (средство выбора приложений)

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

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

Я попытался использовать «Record Expresso Test» Android Studio, я выполнил следующие шаги теста.

  1. нажмите на действие, которое отправляет мое изображение в приложение на устройстве (action1)
  2. увидел окно выбора приложений для Android и выбрал фотографии
  3. Нажал назад, чтобы закрыть приложение для фотографий и вернуться в мое приложение.
  4. нажмите на другое действие в моем приложении (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. Вместе с этими двумя проверками он должен идентифицировать только средство выбора приложений.


person se22as    schedule 22.06.2017    source источник
comment
Должно быть возможно с помощью UI Automator — developer.android.com/training/testing/ui -automator.html   -  person John O'Reilly    schedule 22.06.2017
comment
Спасибо, это был блестящий сборщик, я могу вызвать код UI Automator из своего кода Expresso. Теперь, чтобы выяснить, как точно определить, отображается средство выбора приложений.   -  person se22as    schedule 22.06.2017


Ответы (1)


Благодарность за ответ на этот вопрос принадлежит Джону О'Рейли, который посоветовал мне использовать UI Automator.

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

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

public static boolean verifyAndroidScreenTitlePresent(String title) {
    UiDevice mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

    UiObject titleTextUI = new UiObject(new UiSelector()
            .className("android.widget.TextView")
            .text(title)
    );
    boolean titleExists = titleTextUI.exists();

    // close the app selector to go back to our app so we can carry on with Expresso
    mDevice.pressBack();

    return titleExists;
}
person se22as    schedule 31.01.2018