Prueba de ViewPager con múltiples fragmentos usando espresso android

Estoy tratando de probar mi aplicación que utiliza ViewPager . Cada página contiene fragmentos pero estos fragmentos no siempre son visibles. Quiero comprobar la visibilidad de un fragmento en la página visible actualmente.

 onView(withId(R.id.container_weather)) .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))); 

Pero el problema es que parece espresso todas las páginas no sólo la página actual y me sale el siguiente error:

Android.support.test.espresso.AmbiguousViewMatcherException: 'con id: eu.airpatrol.android:id/container_weather' hace coincidir varias vistas en la jerarquía …

Sus pruebas están fallando debido a múltiples elementos con el mismo id. Puede combinar las condiciones usando allOf(...) . A continuación, use isDisplayed() para comprobar que la vista coincidente está visible en la pantalla. A continuación el ejemplo puede funcionar:

 onView(allOf( withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE), withId(R.id.container_weather))) .check(matches(isDisplayed())); 

Funcionó en este mismo problema. Tuve suerte porque las jerarquías de vista en mi ViewPager pueden ser fácilmente identificadas por sus hermanos, así que pude resolver esto usando el hasSibling hasSibling, así:

 onView( allOf( hasSibling(withId(R.id.some_sibling)), withId(R.id.field_to_test) ) ).perform(replaceText("123")); 

No es una solución perfecta, ya que puede ser ligeramente frágil, pero en mi caso creo que era un compromiso aceptable.

Tuve un problema similar, donde estaba reutilizando el diseño del botón y me estaba dando una coincidencias múltiples vistas en la excepción de jerarquía.

Así que el trabajo fácil que hice fue crear 2 pantallas diferentes y tener 2 métodos diferentes con texto diferente.

  1. Pantalla de Retirada:

     public WithdrawScreen clickWithdraw() { onView(allOf(withId(R.id.save_button), withText("Withdraw"))) .perform(click()); return this; } 
  2. Pantalla de depósito:

     public DepositScreen clickDeposit() { onView(allOf(withId(R.id.save_button), withText("Deposit"))) .perform(click()); return this; } 

Y en mis pruebas, creo una nueva instancia de ambas pantallas y llamar a los métodos anteriores basados ​​en la referencia de la pantalla que es un poco fácil de probar.

 WithdrawScreen withdrawInstance = new WithdrawScreen(); withdrawInstance.clickWithdraw(); DepositScreen depositInstance = new DepositScreen(); depositInstance.clickDeposit(); 

El punto era que estaban usando el mismo id – R.id.save_button para el botón y yo estaba reemplazando el texto del botón basado en la visibilidad del fragmento en el que estamos.

Espero eso ayude.

Tuve el mismo problema, sin embargo utilizando la condición isCompletelyDisplayed() resuelto este problema, ya que sólo tiene en cuenta las vistas en pantalla.

Por lo tanto, algo como esto debería funcionar:

 onView(allOf(withId(R.id.container_weather), isCompletelyDisplayed())) .check(matches(withEffectiveVisibility(ViewMatchers.Visibility.VISIBLE))); 

Nota: isDisplayed() funciona también en algunos casos, pero también toma las vistas fuera de pantalla en cuenta y no funcionará si el ViewPager tiene cualquier otro fragmento de página pr cargado con el mismo id de vista.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.