Como posso usar o Espresso para clicar em uma visualização específica dentro de um item RecyclerView ? Sei que posso clicar no item na posição 0 usando:
onView(withId(R.id.recyclerView))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
Mas preciso clicar em uma visualização específica dentro desse item e não no próprio item.
Desde já, obrigado.
- editar -
Para ser mais preciso: eu tenho um RecyclerView ( R.id.recycler_view
) cujos itens são CardView ( R.id.card_view
). Dentro de cada CardView tenho quatro botões (entre outras coisas) e quero clicar em um botão específico ( R.id.bt_deliver
).
Gostaria de usar os novos recursos do Espresso 2.0, mas não tenho certeza se isso é possível.
Se não for possível, quero usar algo assim (usando o código de Thomas Keller):
onRecyclerItemView(R.id.card_view, ???, withId(R.id.bt_deliver)).perform(click());
mas não sei o que colocar nos pontos de interrogação.
fonte
Respostas:
Você pode fazer isso com a ação de visualização personalizada.
Então você pode clicar nele com
fonte
Agora, com android.support.test.espresso.contrib, ficou mais fácil:
1) Adicionar dependência de teste
* exclua 3 módulos, porque muito provavelmente você já os tem
2) Em seguida, faça algo como
Ou
Ou
fonte
exclude group: 'com.android.support' exclude module: 'recyclerview-v7'
actionOnItemAtPosition
requer um parâmetro de tipo. Não tenho certeza do que colocar lá.Aqui está como resolvi o problema no kotlin:
e depois
fonte
Tente a próxima abordagem:
fonte
Você pode clicar no terceiro item de
recyclerView
como este:Não se esqueça de fornecer o
ViewHolder
tipo para que a inferência não falhe.fonte
<RecyclerView.ViewHolder>
obrigado senhor;)Todas as respostas acima não funcionaram para mim, então eu construí um novo método que pesquisa todas as visualizações dentro de uma célula para retornar a visualização com o ID solicitado. Requer dois métodos (podem ser combinados em um):
Por fim, você pode usar isso no Recycler View fazendo o seguinte:
Você pode usar um retorno de chamada para retornar a visualização se quiser fazer algo mais com ela, ou apenas construir 3-4 versões diferentes disso para fazer qualquer outra tarefa.
fonte
Continuei tentando vários métodos para descobrir por que a resposta de
OnTouchListener()
@blade não estava funcionando para mim, apenas para perceber que eu tinha um , modifiquei ViewAction de acordo:fonte
Você pode até mesmo generalizar essa abordagem para apoiar mais ações não só
click
. Aqui está minha solução para isso:E então
EditText
você pode fazer algo assim:fonte
Primeiro, dê a seus botões contentDescriptions exclusivos, ou seja, "linha 5 do botão de entrega".
<button android:contentDescription=".." />
Em seguida, role para a linha:
onView(withId(R.id.recycler_view)).perform(RecyclerViewActions.scrollToPosition(5));
Em seguida, selecione a exibição com base em contentDescription.
onView(withContentDescription("delivery button row 5")).perform(click());
A descrição do conteúdo é uma ótima maneira de usar o onView do Espresso e tornar seu aplicativo mais acessível.
fonte
withText("Order")
funcionaria também e não exigiria que você soubesse na hora do teste o que está pedindo.