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


86

Я намагаюся написати кілька тестів з новим набором тестів для Android (еспресо) . Але я не можу знайти жодної інформації про те, як перевірити, чи відображається діалогове вікно, і виконати з ним деякі дії (наприклад, натискання позитивних і негативних кнопок тощо). Зверніть увагу, що діалогове вікно також може відображатися програмою a WebView, а не самою програмою.

Будь-яка допомога буде вдячна. Мені просто потрібно посилання або якийсь приклад коду для основ:

  1. Перевірте, чи не з’явиться діалогове вікно
  2. Виконайте клацання на діалогових кнопках
  3. Взаємодія з внутрішнім видом діалогового вікна (якщо це власний вигляд)
  4. Попередньо клацніть кліки поза діалоговим вікном і перевірте, відображається воно чи ні (наприклад, якщо його setCancelable(false)було викликано у конструкторі діалогових вікон, і ми хочемо це перевірити)

Дякую за пораду!


Будь-який відгук щодо моєї відповіді нижче ??
заперечує

Відповіді:


123
  1. Щоб перевірити, чи з'являється діалогове вікно, ви можете просто перевірити, чи відображається View з текстом, який присутній усередині діалогового вікна:

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

    або, на основі тексту з ідентифікатором

    onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
    
  2. Щоб натиснути кнопку діалогових вікон, зробіть це (button1 - OK, button2 - Cancel):

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

    ОНОВЛЕННЯ

  3. Я думаю, що це можливо, оскільки Espresso має підтримку декількох вікон .
  4. Не впевнені в тому, що клацніть за межами користувацького діалогового вікна, але для перевірки, чи відображається воно, вам потрібно створити власний збіг та перевірити всередині нього.

3
Крок 1 не працював для мене в ProgressDialog. Просто намагаюся перевірити заголовок та повідомлення діалогу
Тім Боланд

1
Що це з еспресо та статичним імпортом? З яких класів походять ці методи? Чому ви використовуєте статичне імпортування у відповіді на переповнення стека?

2
@jvrodrigues кожен підручник еспресо використовує статичний імпорт. Я пропоную вам просто звикнути (хоча я розумію розчарування). Це допомагає: google.github.io/android-testing-support-library/docs
AutonomousApps

На кроці 4 замість клацання поза діалоговим вікном ви можете зателефонувати "pressBack ();" що відхиляє діалог. це еквівалентно використанню апаратної кнопки повернення.
Ітан,

Проект @denys переміщено. здається, посилання мертве.
Neon Warge

67

В даний час я цим користуюся, і, здається, це чудово працює.

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

27

Якщо у вас такий 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());

2
Текст у моєму випадку мав ідентифікатор, android.R.id.messageа заголовок - прихований ідентифікатор android.R.id.alertTitle.
Джейсон Робінсон,

2
Якщо ви використовуєте AlertDialog (або DialogFragment), що надходить із бібліотеки підтримки AppCompat, використовуйте це:int alertDialogTitleId = android.support.v7.appcompat.R.id.alertTitle;
Mr-IDE

3

Щоб відповісти на запитання 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()))));
}

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());

3

Кнопки Ідентифікатори 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();
}

1
На насправді, android.R.id.button1, android.R.id.button2і android.R.id.button3для «позитив», «нейтральний» і «негативний», є глобальні символи , які можуть бути використані. Якщо ви вирішили вибрати кнопки за їх текстом - що цілком нормально - вам не потрібен UIAutomator, але ви можете зробити те ж саме з еспресо onView(withText("ButtonTest")).perform(click()).
Thomas Keller

Я використовував це рішення з тестовим фреймворком Robotium, і мені легко було вибрати кнопки діалогового вікна ОС Android. Врятував мені купу часу. Дякую jaydeepw!
Рей

@ThomasKeller Я раніше використовував ідентифікатори button1, button2, мої тести ламалися, коли я запускав їх на різних пристроях. Відображене діалогове вікно - це система управління. Не ваш контроль / користувальницький інтерфейс. Для будь-чого, що знаходиться поза вашим інтерфейсом, рекомендується UIAutomator.
JaydeepW,

Це воно. Дуже дякую.
1lb3r

3

Про всяк випадок, коли хтось наткнеться на це питання, як я. Усі відповіді працюватимуть лише для діалогів із діалоговими кнопками. Не намагайтеся використовувати це для діалогів прогресу без взаємодії користувача. Еспресо продовжує чекати, поки програма перейде в режим очікування. Поки діалогове вікно прогресу видно, програма не простоює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.