Übereinstimmungen (nicht (isDisplayed ())) schlagen mit NoMatchingViewException fehl

85

Ich versuche, das Fehlen der UI-Ansicht zu testen. Die Ansichtsauswahl lautet wie folgt:

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

Der Selektor funktioniert einwandfrei, um zu überprüfen, ob die Ansicht angezeigt wird, gibt jedoch einen Fehler beim Überprüfen, ob die Ansicht nicht angezeigt wird. Ich benutze dies wie folgt:

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

Aber ich bekomme folgenden Fehler:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: Keine Ansichten in der Hierarchie gefunden, die übereinstimmen: mit id: is Wenn die Zielansicht nicht Teil der Ansichtshierarchie ist, müssen Sie möglicherweise Espresso.onData verwenden, um Laden Sie es von einer der folgenden AdapterViews: android.widget.ListView {...}

Das ist merkwürdig. Ich überprüfe das Fehlen der Benutzeroberfläche und es wird erwartet, dass diese Ansicht nicht gefunden wird. Warum wirft Espresso dann einen Fehler? Bitte schlagen Sie vor, was hier schief gehen könnte.

Danke, erstaunt!

user846316
quelle

Antworten:

160

Müssen doesNotExist()stattdessen verwenden. Gefunden hier .

Wenn sich die Ansicht in der Ansichtshierarchie befindet, sich jedoch in einem unsichtbaren Zustand befindet (Sichtbarkeit ist auf "UNSICHTBAR" eingestellt), verwenden Sie not(isDisplayed). Wenn die Ansicht jedoch überhaupt nicht in der Ansichtshierarchie vorhanden ist (z. B. Sichtbarkeit auf 'GONE' gesetzt), doesNotExist()wird sie verwendet.

user846316
quelle
17
Es funktioniert nicht für mich, aber es onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));hat funktioniert.
Sithu
35
@Sithu -Es hängt von der App ab. Wenn die gesuchte Ansicht in der Ansichtshierarchie vorhanden, aber unsichtbar ist, müssen Sie nicht (isDisplayed) verwenden. Wenn die Ansicht jedoch nicht in der Ansichtshierarchie vorhanden ist, müssen Sie doesNotExist () verwenden.
user846316
1
Ich habe den Knopf in dem Layout, sondern Satz Sichtbarkeit View.GONEin onCreateauf Benutzerrolle. Bedeutet das also, dass es in der Ansichtshierarchie und unsichtbar ist?
Sithu
Ja! Danke dafür, super hat mein Problem gelöst und macht meinen Morgen viel besser (ging mit diesem Problem ins Bett).
Booger
Wenn die Ansicht aus der Ansichtshierarchie entfernt wurde - was passieren kann, wenn eine Aktion einen Übergang zu einer anderen Aktivität verursacht -, sollten Sie das Beispiel ViewAssertions.doesNotExist (): View.GONE in Ihrem Beispiel verwenden, das falsch und irreführend ist. Bitte bearbeiten Sie Ihre Antwort
metis
18

Arbeiten Sie auch mit Ihrer Methode, aber so ähnlich:

onView(withId(R.id.next)).check(matches(not(isDisplayed())));
Morozov
quelle
13
onView(withText("")).check(doesNotExist());
Olivia Liao
quelle
5
Dies ist eine teilweise korrekte Antwort. Dies funktioniert nur, wenn die Targedet-Ansicht nicht im Layout vorhanden ist (die Ansichtshierarchie enthält diese Ansicht nicht). Diese Behauptung schlägt jedoch fehl, wenn die Zielansicht tatsächlich in der Layoutansichtshierarchie vorhanden ist, der Sichtbarkeitsstatus jedoch GONE oder INVISIBLE ist. In diesem Fall wird die Meldung "Assertion Failure" angezeigt:android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...
Simon-Droid
Richtig, ich denke, Sie könnten die Fehlermeldung anhand der detaillierten Ansichtshierarchie überprüfen.
Olivia Liao
8

Wenn Sie überprüfen möchten, ob Viewentweder nicht sichtbar oder nicht vorhanden ist .

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

Verwendung:

onView(withId(R.id.someView)).check(isNotDisplayed());
jimmy0251
quelle
Vielen Dank dafür - IMHO ist dies die beste Lösung für eine allgemeine "Überprüfung, ob die Ansicht vom Bildschirm verschwunden ist". Eine Korrektur jedoch: IME, die Verwendung istonView(withId(R.id.someView)).check(isNotDisplayed());
String
4

Sie können diese Option ausprobieren, wenn Sie die Sichtbarkeit der Ansicht "withEffectiveVisibility" überprüfen.

    onViewWithId(R.id.YOURVIEW).check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
Pabel
quelle
Die anderen haben nicht funktioniert, aber dieser hat funktioniert. Danke
Saul_programa