matchs(not(isDisplayed())) schlägt mit NoMatchingViewException fehl

Lesezeit: 3 Minuten

Benutzeravatar von user846316
Benutzer846316

Ich versuche, das Fehlen der UI-Ansicht zu testen. Die Ansichtsauswahl ist 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 verwende diese 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 passend: mit ID: ist Wenn die Zielansicht nicht Teil der Ansichtshierarchie ist, müssen Sie möglicherweise Espresso.onData verwenden Laden Sie es von einem 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 löst Espresso dann einen Fehler aus? Bitte schlagen Sie vor, was hier schief laufen könnte.

Benutzeravatar von user846316
Benutzer846316

Brauchen Sie zu verwenden doesNotExist() stattdessen. Gefunden hier.

Wenn die Ansicht in der Ansichtshierarchie vorhanden ist, sich jedoch in einem unsichtbaren Zustand befindet (Sichtbarkeit auf „UNSICHTBAR“ gesetzt ist), verwenden Sie not(isDisplayed). Wenn die Ansicht jedoch überhaupt nicht in der Ansichtshierarchie vorhanden ist (z. B. Sichtbarkeit auf ‘GONE’ gesetzt), doesNotExist() wird genutzt.

  • Bei mir funktioniert es nicht, aber onView(withId(R.id.myTestId)).check(matches(not(isDisplayed()))); funktionierte.

    – Sithu

    21. April 2016 um 5:39 Uhr

  • @Sithu -Es hängt von der App ab. Wenn die gesuchte Ansicht in der Ansichtshierarchie vorhanden, aber unsichtbar ist, müssen Sie not(isDisplayed) verwenden. Wenn sich die Ansicht jedoch nicht in der Ansichtshierarchie befindet, müssen Sie doesNotExist() verwenden.

    – Benutzer846316

    21. April 2016 um 11:42 Uhr


  • Ich habe die Schaltfläche im Layout, aber die Sichtbarkeit eingestellt View.GONE in onCreate nach Benutzerrolle. Bedeutet das also, dass es in der Ansichtshierarchie und unsichtbar ist?

    – Sithu

    22. April 2016 um 2:31 Uhr


  • Ja! Danke dafür, hat mein Problem super gelöst und macht meinen Morgen viel besser (bin mit diesem Problem ins Bett gegangen).

    – Popel

    6. Juni 2018 um 15:23 Uhr

  • View.GONE funktioniert mit not(isDisplayed(), funktioniert aber nicht mit doesNotExist(). doesNotExist gibt true zurück, wenn die Sichtbarkeit GONE ist. Ich habe es mit Beispiel versucht. In dem Link, den Sie angegeben haben, steht nichts im Zusammenhang mit View.GONE.

    – metis

    16. Juli 2020 um 16:03 Uhr


Arbeite auch mit deiner Methode, aber ungefähr so:

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

Benutzeravatar von Olivia Liao
Olivia Liao

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

  • Dies ist eine teilweise richtige Antwort. Dies funktioniert nur, wenn die Zielansicht nicht im Layout vorhanden ist (die Ansichtshierarchie enthält diese Ansicht nicht). Diese Assertion schlägt jedoch fehl, wenn die Zielansicht tatsächlich in der Layout-Ansichtshierarchie vorhanden ist, ihr Sichtbarkeitsstatus jedoch GONE oder INVISIBLE ist. Die Assertionsfehlermeldung lautet in diesem Fall: android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...

    – Simon-Droid

    29. Dezember 2016 um 15:46 Uhr


  • Richtig, also denke ich, dass Sie die Fehlermeldung mit der Detailansichtshierarchie überprüfen könnten.

    – Olivia Liao

    29. Dezember 2016 um 19:54 Uhr

Benutzeravatar von Pabel
Pabel

Sie können diese Option ausprobieren, wenn Sie die Sichtbarkeit der Ansicht “withEffectiveVisibility” aktivieren.

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

Benutzeravatar von jimmy0251
jimmy0251

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

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

  • Vielen Dank dafür – IMHO ist dies die beste Lösung für eine allgemeine “Prüfung, ob die Ansicht vom Bildschirm verschwunden ist”. Eine Korrektur jedoch: IME, die Verwendung ist onView(withId(R.id.someView)).check(isNotDisplayed());

    – Sterling

    5. Juni 2018 um 23:35 Uhr

  • Vielen Dank dafür – IMHO ist dies die beste Lösung für eine allgemeine “Prüfung, ob die Ansicht vom Bildschirm verschwunden ist”. Eine Korrektur jedoch: IME, die Verwendung ist onView(withId(R.id.someView)).check(isNotDisplayed());

    – Sterling

    5. Juni 2018 um 23:35 Uhr

1439120cookie-checkmatchs(not(isDisplayed())) schlägt mit NoMatchingViewException fehl

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy