dopasowuje (not (isDisplayed ())) kończy się niepowodzeniem z NoMatchingViewException

85

Próbuję przetestować brak widoku interfejsu użytkownika. Selektor widoku jest następujący:

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

Selektor działa dobrze, aby sprawdzić, czy widok jest wyświetlany, ale powoduje błąd podczas sprawdzania, czy widok nie jest wyświetlany. Używam tego w następujący sposób:

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

Ale pojawia się następujący błąd:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: Brak widoków w hierarchii pasujących: z id: is Jeśli widok docelowy nie jest częścią hierarchii widoków, może być konieczne użycie Espresso.onData do załaduj go z jednego z następujących AdapterViews: android.widget.ListView {...}

To jest dziwne. Sprawdzam brak interfejsu użytkownika i oczekuje się, że ten widok nie zostanie znaleziony. Więc dlaczego Espresso rzuca błąd? Proszę zasugerować, co może być tutaj nie tak.

Dzięki, zdziwiony!

user846316
źródło

Odpowiedzi:

161

Musisz użyć doesNotExist()zamiast tego. Znaleziono tutaj .

Jeśli widok znajduje się w hierarchii widoków, ale jest w stanie niewidocznym (widoczność jest ustawiona na „INVISIBLE”), użyj not(isDisplayed). Jeśli jednak widoku w ogóle nie ma w hierarchii widoków (np. Widoczność ustawiona na „GONE”), doesNotExist()jest używana.

user846316
źródło
17
To nie działa dla mnie, ale onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));zadziałało.
Sithu
35
@Sithu -To zależy od aplikacji. Jeśli widok, którego szukasz, znajduje się w hierarchii widoków, ale jest niewidoczny, musisz użyć not (isDisplayed). Jeśli jednak widoku nie ma w hierarchii widoków, należy użyć doesNotExist ().
user846316
1
Mam przycisk w układzie, ale ustawiłem widoczność View.GONEw onCreateroli użytkownika. Czy to oznacza, że ​​jest w hierarchii widoków i jest niewidoczny?
Sithu
Tak! Dzięki za to, super rozwiązałem mój problem i znacznie poprawiłem mój poranek (poszedłem spać z tym problemem).
Booger
Jeśli widok zniknął z hierarchii widoków - co może się zdarzyć, gdy akcja spowodowała przejście do innego działania - należy użyć ViewAssertions.doesNotExist (): View.GONE przykład w twoim przykładzie jest błędny i wprowadzający w błąd. Edytuj swoją odpowiedź
metis
18

Pracuj również ze swoją metodą, ale coś takiego:

onView(withId(R.id.next)).check(matches(not(isDisplayed())));
Morozov
źródło
13
onView(withText("")).check(doesNotExist());
Olivia Liao
źródło
5
To jest częściowo poprawna odpowiedź. To zadziała tylko wtedy, gdy widok zestawu docelowego nie istnieje w układzie (hierarchia widoków nie zawiera tego widoku). Jednak to stwierdzenie nie powiedzie się, jeśli widok docelowy faktycznie istnieje w hierarchii widoku układu, ale jego stan widoczności to BRAK lub NIEWIDOCZNY. Komunikat o niepowodzeniu asercji w tym przypadku będzie zawierał:android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...
Simon-Droid
Dobrze, więc myślę, że możesz sprawdzić komunikat o błędzie ze szczegółową hierarchią widoku.
Olivia Liao
8

Jeśli chcesz sprawdzić, czy Viewjest niewidoczny lub nie istnieje .

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

Stosowanie:

onView(withId(R.id.someView)).check(isNotDisplayed());
jimmy0251
źródło
Dzięki za to - IMHO to najlepsze rozwiązanie na uogólnione „sprawdzenie, czy widok zniknął z ekranu”. Jedna poprawka: IME, użycie toonView(withId(R.id.someView)).check(isNotDisplayed());
String
4

Możesz wypróbować tę opcję, jeśli zaznaczysz widoczność widoku „withEffectiveVisibility”

    onViewWithId(R.id.YOURVIEW).check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
Pabel
źródło
Inne nie działały, ale ten działał. Dzięki
Saul_programa