Tengo notificación emergente. Mi primera prueba verifica si se muestra esa notificación y pasa con éxito. Yo uso el siguiente método para esta prueba:
fun viewInNotificationPopupIsDisplayed(viewMatcher: Matcher<View>) { onView(viewMatcher) .inRoot(RootMatchers.isPlatformPopup()) .check(ViewAssertions.matches(isDisplayed())) }Tengo un problema con el segundo caso de prueba en el que tengo que verificar que mi notificación emergente ya haya desaparecido (significa que ya no se muestra). Así que estoy tratando de usar el siguiente método:
fun viewInNotificationPopupIsNotDisplayed(viewMatcher: Matcher<View>) { Espresso.onView(viewMatcher) .inRoot(RootMatchers.isPlatformPopup()) .check(matches(not(isDisplayed()))) //.check(ViewAssertions.doesNotExist()) // doesn't work as well }Obtengo la siguiente excepción:
android.support.test.espresso.NoMatchingRootException: Matcher 'with decor view of type PopupWindow$PopupViewContainer' did not match any of the following roots: [Root{application-window-token=android.view.ViewRootImpl$W@bb8371e, window-token=android.view.ViewRootImpl$W@bb8371e, has-window-focus=true,Por favor, ¿alguien puede ayudar con esto?
Parece que una verificación tan simple es imposible con espresso si tiene una PopupWindow debido a la forma en que se lanza la NoMatchingRootException
Puede capturar la excepción y completar la prueba, pero esa no es una buena opción, ya que lanzar y capturar NoMatchingRootException consume mucho tiempo en comparación con el caso de prueba predeterminado. Parece que Espresso está esperando la Raíz por un tiempo
Para este caso, se sugiere renunciar al espresso aquí y usar UiAutomator para esta afirmación.
val device: UiDevice get() = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()) fun assertPopupIsNotDisplayed() { device.waitForIdle() assertFalse(device.hasObject(By.text(yourText)))) } fun assertPopupIsDisplayed() { device.waitForIdle() assertTrue(device.hasObject(By.text(yourText)))) }