Проверьте, отображается ли диалоговое окно с эспрессо


Я пытаюсь написать несколько тестов с новой android-test-kit (Эспрессо). Но я не могу найти никакой информации о как проверьте, отображается ли диалоговое окно, и выполните над ним некоторые действия (например, нажатие положительных и отрицательных кнопок и т. д.). Обратите внимание, что диалоговое окно может также отображаться с помощью WebView, а не самим приложением.

любая помощь будет оценили. Мне просто нужна ссылка, или какой-то пример кода основы:

  1. Проверьте, появляется ли диалоговое окно
  2. выполнение кликов по диалоговым кнопкам
  3. взаимодействие с внутренним видом диалогового окна (если это пользовательский вид)
  4. преформа щелкает вне диалогового окна и проверяет, отображается ли она или нет (например, если setCancelable(false) был вызван в диалоговом конструкторе, и мы хотим это проверить)

Спасибо за совет!

6 59

6 ответов:

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

    onView(withText("dialogText")).check(matches(isDisplayed()));
    

    или на основе текста с идентификатором

    onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
    
  2. чтобы нажать на кнопку диалогов сделать это (button1-OK, button2-отмена):

    onView(withId(android.R.id.button1)).perform(click());
    

    обновление

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

Я в настоящее время использую это, и это, кажется, работает нормально.

onView(withText(R.string.my_title))
    .inRoot(isDialog()) // <---
    .check(matches(isDisplayed()));

Если у вас есть AlertDialog так:

enter image description here

вы можете проверить, отображаются ли компоненты:

int titleId = mActivityTestRule.getActivity().getResources()
        .getIdentifier( "alertTitle", "id", "android" );

onView(withId(titleId))
        .inRoot(isDialog())
        .check(matches(withText(R.string.my_title)))
        .check(matches(isDisplayed()));

onView(withId(android.R.id.text1))
        .inRoot(isDialog())
        .check(matches(withText(R.string.my_message)))
        .check(matches(isDisplayed()));

onView(withId(android.R.id.button2))
        .inRoot(isDialog())
        .check(matches(withText(android.R.string.no)))
        .check(matches(isDisplayed()));

onView(withId(android.R.id.button3))
        .inRoot(isDialog())
        .check(matches(withText(android.R.string.yes)))
        .check(matches(isDisplayed()));

действие:

onView(withId(android.R.id.button3)).perform(click());

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

чтобы ответить на вопрос 4, который принятый ответ не делает, я изменил следующий код, который я нашел здесь на Stack Overflow (ссылке) для проверки того, был показан тост.

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) {
    return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

The id передается идентификатор a View в настоящее время отображается в диалоговом окне. Вы также можете написать метод следующим образом:

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) {
    return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

и теперь он ищет View содержит определенную текстовую строку.

использовать его как Итак:

getRootView(getActivity(), R.id.text_id).perform(click());

кнопка идентификаторы ИД Р..button1 и ИД Р..button2 находились не будешь же на всех устройствах. Идентификаторы могут меняться вместе с версиями ОС.

правильный способ достичь этого-использовать UIAutomator. Включите зависимость UIAutomator в свою сборку.gradle

// Set this dependency to build and run UI Automator tests
  androidTestCompile 'com.android.support.test.uiautomator:uiautomator-v18:2.1.2'

и использовать

// Initialize UiDevice instance
UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

// Search for correct button in the dialog.
UiObject button = uiDevice.findObject(new UiSelector().text("ButtonText"));
if (button.exists() && button.isEnabled()) {
    button.click();
}