¿Cómo puedo usar Espresso para hacer clic en una vista específica dentro de un elemento RecyclerView ? Sé que puedo hacer clic en el elemento en la posición 0 usando:
onView(withId(R.id.recyclerView))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
Pero necesito hacer clic en una vista específica dentro de ese elemento y no en el elemento en sí.
Gracias por adelantado.
- editar -
Para ser más precisos: tengo un RecyclerView ( R.id.recycler_view
) cuyos elementos son CardView ( R.id.card_view
). Dentro de cada CardView tengo cuatro botones (entre otras cosas) y quiero hacer clic en un botón específico ( R.id.bt_deliver
).
Me gustaría utilizar las nuevas funciones de Espresso 2.0, pero no estoy seguro de que sea posible.
Si no es posible, quiero usar algo como esto (usando el código de Thomas Keller):
onRecyclerItemView(R.id.card_view, ???, withId(R.id.bt_deliver)).perform(click());
pero no sé qué poner en los signos de interrogación.
fuente
Respuestas:
Puede hacerlo con la acción de vista personalizada.
Entonces puedes hacer clic en él con
fuente
Ahora con android.support.test.espresso.contrib se ha vuelto más fácil:
1) Agregar dependencia de prueba
* excluye 3 módulos, porque es muy probable que ya lo tengas
2) Entonces haz algo como
O
O
fuente
exclude group: 'com.android.support' exclude module: 'recyclerview-v7'
actionOnItemAtPosition
requiere un tipo param. No estoy seguro de qué poner allí.Así es como resolví el problema en kotlin:
y entonces
fuente
Prueba el siguiente enfoque:
fuente
Puede hacer clic en el tercer elemento de
recyclerView
Me gusta:No olvide proporcionar el
ViewHolder
tipo para que la inferencia no falle.fuente
<RecyclerView.ViewHolder>
gracias señor;)Todas las respuestas anteriores no funcionaron para mí, así que he creado un nuevo método que busca todas las vistas dentro de una celda para devolver la vista con la ID solicitada. Requiere dos métodos (se pueden combinar en uno):
Luego, finalmente, puede usar esto en Recycler View haciendo lo siguiente:
Puede usar una devolución de llamada para devolver la vista si desea hacer algo más con ella, o simplemente crear 3-4 versiones diferentes de esto para realizar otras tareas.
fuente
Seguí probando varios métodos para encontrar por qué la respuesta de @ blade no funcionaba para mí, solo para darme cuenta de que tengo un
OnTouchListener()
, modifiqué ViewAction en consecuencia:fuente
Incluso puede generalizar este enfoque para respaldar más acciones, no solo
click
. Aquí está mi solución para esto:Y luego
EditText
puedes hacer algo como esto:fuente
En primer lugar, asigne descripciones de contenido únicas a sus botones, es decir, "fila 5 del botón de entrega".
<button android:contentDescription=".." />
Luego, desplácese a la fila:
onView(withId(R.id.recycler_view)).perform(RecyclerViewActions.scrollToPosition(5));
Luego seleccione la vista basada en contentDescription.
onView(withContentDescription("delivery button row 5")).perform(click());
La descripción del contenido es una excelente manera de usar onView de Espresso y hacer que su aplicación sea más accesible.
fuente
withText("Order")
también funcionaría y no requeriría que sepas en el momento de la prueba lo que estás pidiendo.