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

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

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

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

  • Проверьте, отображается ли диалоговое окно
  • Выполнять клики по кнопкам диалога
  • Взаимодействие с внутренним представлением диалога (если это пользовательский вид)
  • Предварительная задержка заходит за диалоговое окно и проверяет, отображается ли она или нет (например, если setCancelable(false) был вызван в построителе диалогов, и мы хотим проверить это)

Спасибо вам за консультацию!

4b9b3361

Ответ 1

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

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

    или, на основе текста с id

    onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
    
  • Чтобы щелкнуть по кнопке диалога, сделайте это (кнопка1 - ОК, кнопка2 - Отмена):

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

    UPDATE

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

Ответ 2

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

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

Ответ 3

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

введите описание изображения здесь

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

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

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

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

Переданный id - это идентификатор 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());

Ответ 5

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

Ответ 6

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

Правильный способ добиться этого - использовать UIAutomator. Включите зависимость UIAutomator в файле build.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();
}