coincidencias (no (isDisplayed ())) falla con NoMatchingViewException

85

Estoy tratando de probar la ausencia de la vista de IU. El selector de vista es el siguiente:

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

El selector funciona bien para verificar si se muestra la vista, pero da error al verificar si la vista no se muestra. Estoy usando esto de la siguiente manera:

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

Pero obtengo el siguiente error:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: No se encontraron vistas en la jerarquía que coincidan: con id: is Si la vista de destino no forma parte de la jerarquía de vistas, es posible que deba usar Espresso.onData para cárguelo desde uno de los siguientes AdapterViews: android.widget.ListView {...}

Esto es extraño. Estoy comprobando la ausencia de la interfaz de usuario y se espera que no se encuentre esta vista. Entonces, ¿por qué Espresso arroja un error? Sugiera qué podría estar fallando aquí.

¡Gracias, asombrado!

user846316
fuente

Respuestas:

161

Necesito usar doesNotExist()en su lugar. Encontrado aquí .

Si la vista está en la jerarquía de vistas pero en un estado invisible (la visibilidad está configurada como 'INVISIBLE'), use not(isDisplayed). Sin embargo, si la vista no está allí en absoluto en la jerarquía de vista (por ejemplo, la visibilidad establecida en 'GONE'), doesNotExist()se utiliza.

user846316
fuente
17
No me funciona, pero onView(withId(R.id.myTestId)).check(matches(not(isDisplayed())));funcionó.
Sithu
35
@Sithu -Depende de la aplicación. Si la vista que está buscando está en la jerarquía de vistas pero es invisible, entonces debe usar not (isDisplayed). Sin embargo, si la vista no está en la jerarquía de vistas, debe usar doesNotExist ().
user846316
1
Tengo el botón en el diseño, pero configuro la visibilidad View.GONEen onCreatefunción del usuario. Entonces, ¿significa que está en la jerarquía de vistas y es invisible?
Sithu
¡Si! Gracias por esto, super resolvió mi problema y hace que mi mañana sea mucho mejor (me fui a la cama con este problema).
Booger
Si la vista desaparece de la jerarquía de vistas, lo que puede suceder cuando una acción provocó una transición a otra actividad, debe usar ViewAssertions.doesNotExist (): El ejemplo View.GONE de su ejemplo es incorrecto y engañoso. Edite su respuesta
metis
18

También trabaja con tu método, pero algo como esto:

onView(withId(R.id.next)).check(matches(not(isDisplayed())));
Morozov
fuente
13
onView(withText("")).check(doesNotExist());
Olivia Liao
fuente
5
Esta es una respuesta parcialmente correcta. Esto solo funcionará si la vista Targetdet no existe en el diseño (la jerarquía de vista no contiene esta vista). Sin embargo, esta afirmación fallará si la vista de destino realmente existe en la jerarquía de vista del diseño, pero su estado de visibilidad es GONE o INVISIBLE. En ese caso, el mensaje de error de afirmación indicará:android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...
Simon-Droid
Correcto, creo que podría verificar el mensaje de error con la jerarquía de vista detallada.
Olivia Liao
8

Si desea comprobar si Viewes o no es visible o no existe .

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

Uso:

onView(withId(R.id.someView)).check(isNotDisplayed());
jimmy0251
fuente
Gracias por esto. En mi humilde opinión, esta es la mejor solución para un "comprobar si la vista ha desaparecido de la pantalla". Sin embargo, una corrección: IME, el uso esonView(withId(R.id.someView)).check(isNotDisplayed());
Cadena
4

Puede probar esta opción si marca la visibilidad de la vista "withEffectiveVisibility"

    onViewWithId(R.id.YOURVIEW).check(matches(ViewMatchers.withEffectiveVisibility(ViewMatchers.Visibility.GONE)))
Pabel
fuente
Los otros no funcionaron, pero este sí. Gracias
Saul_programa