matches(not(isDisplayed())) falla con NoMatchingViewException

4 minutos de lectura

avatar de usuario de user846316
usuario846316

Estoy tratando de probar la ausencia de la vista de la interfaz de usuario. El selector de vistas es el siguiente:

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

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

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

Pero me sale el siguiente error:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: No se encontraron vistas en la jerarquía que coincidan: con id: es 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? Por favor, sugiera lo que podría estar yendo mal aquí.

avatar de usuario de user846316
usuario846316

Necesitará usar doesNotExist() en cambio. Encontrado aquí.

Si la vista está en la jerarquía de vistas pero en un estado invisible (la visibilidad está establecida en ‘INVISIBLE’), use not(isDisplayed). Sin embargo, si la vista no está en absoluto en la jerarquía de vistas (por ejemplo, la visibilidad se establece en ‘GONE’), doesNotExist() se usa

  • no me funciona pero onView(withId(R.id.myTestId)).check(matches(not(isDisplayed()))); funcionó

    – Sithu

    21 de abril de 2016 a las 5:39

  • @Sithu: depende de la aplicación. Si la vista que está buscando está en la jerarquía de vistas pero es invisible, entonces necesita usar not(isDisplayed). Sin embargo, si la vista no está en la jerarquía de vistas, debe usar doesNotExist().

    – usuario846316

    21 de abril de 2016 a las 11:42


  • Tengo el botón en el diseño, pero configuro la visibilidad. View.GONE en onCreate según el rol de usuario. Entonces, ¿significa que está en la jerarquía de vistas y es invisible?

    – Sithu

    22 de abril de 2016 a las 2:31


  • 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 en su ejemplo es incorrecto y engañoso. Por favor edite su respuesta

    – metis

    16 de julio de 2020 a las 10:17

  • View.GONE funciona con not(isDisplayed() pero no funciona con doesNotExist(). doesNotExist devuelve verdadero si la visibilidad SE HA IDO. Intenté con el ejemplo. En el enlace que proporcionó no se dice nada relacionado con View.GONE.

    – metis

    16 de julio de 2020 a las 16:03


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

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

Avatar de usuario de Olivia Liao
Olivia Liao

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

  • Esta es una respuesta parcialmente correcta. Esto solo funcionará si la vista de destino 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 de diseño, pero su estado de visibilidad es GONE o INVISIBLE. El mensaje de error de aserción en ese caso indicará: android.support.test.espresso.base.DefaultFailureHandler$AssertionFailedWithCauseError: View is present in the hierarchy...

    – Simon-droide

    29 de diciembre de 2016 a las 15:46


  • Correcto, entonces creo que podría verificar el mensaje de error con la jerarquía de vista detallada.

    –Olivia Liao

    29 de diciembre de 2016 a las 19:54

Avatar de usuario de Pabel
Pabellón

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

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

avatar de usuario de jimmy0251
jimmy0251

Si quieres comprobar si View es cualquiera no 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());

  • Gracias por esto: en mi humilde opinión, esta es la mejor solución para un “comprobar si la vista se ha ido de la pantalla” generalizada. Sin embargo, una corrección: IME, el uso es onView(withId(R.id.someView)).check(isNotDisplayed());

    – Libra esterlina

    5 jun 2018 a las 23:35

  • Gracias por esto: en mi humilde opinión, esta es la mejor solución para un “comprobar si la vista se ha ido de la pantalla” generalizada. Sin embargo, una corrección: IME, el uso es onView(withId(R.id.someView)).check(isNotDisplayed());

    – Libra esterlina

    5 jun 2018 a las 23:35

¿Ha sido útil esta solución?