corrisponde a (not (isDisplayed ())) non riesce con NoMatchingViewException


87

Sto cercando di testare l'assenza della vista dell'interfaccia utente. Il selettore di visualizzazione è il seguente:

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

Il selettore funziona bene per controllare se la vista è visualizzata, ma dà un errore nel controllare se la vista non è visualizzata. Lo sto usando come segue:

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

Ma ottengo il seguente errore:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: nessuna vista nella gerarchia trovata corrispondente: con id: is Se la vista di destinazione non fa parte della gerarchia della vista, potrebbe essere necessario utilizzare Espresso.onData per caricarlo da uno dei seguenti AdapterViews: android.widget.ListView {...}

Questo è strano. Sto verificando l'assenza dell'interfaccia utente e si prevede che questa visualizzazione non venga trovata. Allora perché l'Espresso lancia errori? Per favore suggerisci cosa potrebbe andare storto qui.

Grazie, stupito!

Risposte:


166

È necessario utilizzare doesNotExist()invece. Trovato qui .

Se la visualizzazione è presente nella gerarchia della visualizzazione ma in uno stato invisibile (la visibilità è impostata su "INVISIBILE"), utilizzare not(isDisplayed). Tuttavia, se la visualizzazione non è presente nella gerarchia della visualizzazione (ad esempio, la visibilità è impostata su "GONE"), doesNotExist()viene utilizzata.


17
Non funziona per me, ma onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));ha funzionato.
Sithu

37
@Sithu -Dipende dall'app. Se la vista che stai cercando è presente nella gerarchia della vista ma invisibile, devi usare not (isDisplayed). Tuttavia, se la vista non è presente nella gerarchia della vista, è necessario utilizzare doesNotExist ().
user846316

1
Ho il pulsante nel layout, ma insieme la visibilità View.GONEin onCreatesu di ruolo utente. Quindi, significa che è nella gerarchia della vista e invisibile?
Sithu

Si! Grazie per questo, ha super risolto il mio problema e ha reso la mia mattinata molto migliore (sono andato a letto con questo problema).
Booger

Se la vista è passata dalla gerarchia della vista, cosa che può accadere quando un'azione ha causato una transizione a un'altra attività, dovresti usare ViewAssertions.doesNotExist (): L'esempio View.GONE nel tuo esempio è sbagliato e fuorviante. Modifica la tua risposta
metis

18

Lavora anche con il tuo metodo, ma qualcosa del genere:

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

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

5
Questa è una risposta parzialmente corretta. Funzionerà solo se la vista targetizzata non esiste nel layout (la gerarchia della vista non contiene questa vista). Tuttavia, questa asserzione fallirà se la vista targetizzata esiste effettivamente nella gerarchia della vista del layout, ma il suo stato di visibilità è ANDATO o INVISIBILE. Il messaggio di fallimento dell'asserzione in quel caso indicherà:android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...
Simon-Droid

Corretto, quindi penso che potresti controllare il messaggio di errore con la gerarchia della visualizzazione dettagliata.
Olivia Liao

8

Se si desidera verificare se Viewè o non è visibile o non esiste .

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

Utilizzo:

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

Grazie per questo - IMHO questa è la soluzione migliore per un "controllo generale se la vista è sparita dallo schermo". Una correzione, però: IME, l'uso èonView(withId(R.id.someView)).check(isNotDisplayed());
Stringa

4

Puoi provare questa opzione se controlli la visibilità della vista "withEffectiveVisibility"

    onViewWithId(R.id.YOURVIEW).check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.