збіги (not (isDisplayed ())) не вдаються з NoMatchingViewException


85

Я намагаюся перевірити відсутність подання інтерфейсу користувача. Вибір вигляду такий:

public static ViewInteraction onMyTestUi() {
    return onView(withId(R.id.myTestId));
}

Селектор чудово працює, щоб перевірити, чи відображається подання, але видає помилку при перевірці, якщо вигляд не відображається. Я використовую це наступним чином:

 onMyTestUi().check(matches(not(isDisplayed())));

Але я отримую таку помилку:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: Не знайдено жодного подання в ієрархії, що відповідає: з ідентифікатором: є. завантажте його з одного з наступних AdapterViews: android.widget.ListView {...}

Це дивно. Я перевіряю відсутність користувацького інтерфейсу та очікую, що цей погляд не буде знайдений. Тоді чому еспресо кидає помилку? Будь ласка, підкажіть, що тут може піти не так.

Дякую, вражений!

Відповіді:


161

Потрібно використовувати doesNotExist()замість цього. Знайдено тут .

Якщо подання знаходиться в ієрархії подання, але у невидимому стані (видимість встановлено на "НЕВИДИМО"), використовуйте not(isDisplayed). Однак, якщо подання взагалі немає в ієрархії подання (наприклад, для видимості встановлено значення "GONE"), doesNotExist()використовується.


17
У мене це не працює, але все- onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));таки вдалося.
Сітху

35
@Sithu - Це залежить від програми. Якщо ви шукаєте подання, яке є в ієрархії подання, але невидиме, тоді вам потрібно використовувати not (isDisplayed). Однак, якщо подання немає в ієрархії подання, вам потрібно використовувати doesNotExist ().
user846316

1
У мене є кнопки в макеті, але встановити видимість View.GONEв onCreateна ролі користувача. Отже, чи означає це, що він знаходиться в ієрархії поглядів і невидимий?
Сітху

Ага! Дякую за це, супер вирішив мою проблему та покращив ранок (лягав спати з цим питанням).
Бугер

Якщо подання виходить з ієрархії подання, що може статися, коли дія спричинила перехід до іншої діяльності, слід використовувати ViewAssertions.doesNotExist (): Приклад View.GONE у вашому прикладі неправильний та оманливий. Будь ласка, відредагуйте свою відповідь
метис

18

Також працюйте зі своїм методом, але приблизно так:

onView(withId(R.id.next)).check(matches(not(isDisplayed())));

13
onView(withText("")).check(doesNotExist());

5
Це частково правильна відповідь. Це буде працювати лише в тому випадку, якщо подання Targedet не існує у макеті (ієрархія подання не містить цього подання.) Однак це твердження не вдасться, якщо цільовий вигляд насправді існує в ієрархії подання макета, але його стан видимості ПОТРЕБЛЕНО або НЕВИДИМО. Повідомлення про помилку твердження в такому випадку буде стверджувати:android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...
Simon-Droid

Правильно, тому я думаю, що ви можете перевірити повідомлення про помилку з детальною ієрархією подання.
Олівія Ляо,

8

Якщо ви хочете перевірити, якщо Viewце або не видно, або не існує .

public static ViewAssertion isNotDisplayed() {
    return new ViewAssertion() {
        @Override
        public void check(View view, NoMatchingViewException noView) {
            if (view != null && isDisplayed().matches(view)) {
                throw new AssertionError("View is present in the hierarchy and Displayed: "
                        + HumanReadables.describe(view));
            }
        }
    };
}

Використання:

onView(withId(R.id.someView)).check(isNotDisplayed());

Дякую за це - IMHO це найкраще рішення для узагальненої "перевірки, чи не зникає вигляд з екрана". Однак одне виправлення: IME, використанняonView(withId(R.id.someView)).check(isNotDisplayed());
Рядок

4

Ви можете спробувати цей параметр, якщо перевірите видимість перегляду "withEffectiveVisibility"

    onViewWithId(R.id.YOURVIEW).check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.GONE)))

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