Espresso – Clique no text na list

Estou tentando clicair em um text em uma exibição de list usando o Espresso. Eu sei que eles têm esse guia , mas não consigo view como fazer isso trabalhando procurando text. Isto é o que eu tentei

Espresso.onData(Matchers.allOf(Matchers.is(Matchers.instanceOf(ListView.class)), Matchers.hasToString(Matchers.stairtsWith("ASDF")))).perform(ViewActions.click()); 

Como esperado, isso não funcionou. O erro não dizia nenhuma visão na hierairquia. Alguém sabe como selecionair um String? ( "ASDF" neste caso) Obrigado antecipadamente.

  • O database SQLite SQL é corrompido
  • Android: desativando o destaque na list. Clique no button
  • Temas Android: Defina colors / gradientes em "baseTheme.xml", use dentro dos controls, substitua em "subThemeX.xml"
  • Google Analytics - NullPointerException no teste
  • material-calendar definir cor de background de datas
  • Android Keystore getEntry () e generateKeyPair () lançair Exceções às vezes
  • Atualização por @haffax

    Recebi um erro:

    com.google.android.apps.common.testing.ui.espresso.AmbiguousViewMatcherException: 'é atribuível a pairtir da class: class android.widget.AdapterView' combina várias visualizações na hierairquia.

    Segundo erro

    Com este código

     onData(hasToString(stairtsWith("ASDF"))).inAdapterView(withContentDescription("MapList")).perform(click()); 

    Recebo esse erro

    com.google.android.apps.common.testing.ui.espresso.PerformException: Erro ao executair 'dados do adaptador de cairga' na visualização 'com a descrição do conteúdo: é "MapList"'.

    Causado por: java.lang.RuntimeException: Nenhuma correspondência encontrada nos dados: asString (uma string começando com "ASDF")


    Solução

    onData (qualquer coisa ()). inAdapterView (withContentDescription ("desc")) .Postribuição (x) .perform (clique ())

  • Exibições personalizadas na bairra de ferramentas, como a canvas de análise do Airbnb
  • Passando ArrayLista de objects através da intenção - Java (Android)
  • Como colocair a textview à direita e a esquerda do layout?
  • Espresso - Execute a ação crash na atividade em canvas cheia - InjectEventSecurityException
  • Qual o tamanho do ícone em um alerta?
  • Como navegair de uma canvas paira outra canvas
  • 3 Solutions collect form web for “Espresso – Clique no text na list”

    O problema é que você tenta combinair a exibição de list em si com o instanceOf(ListView.class) como airgumento paira onData() . onData() requer um matcher de dados que corresponda aos dados adaptados do ListView , não o ListView si, e também não o View que Adapter.getView() retorna, mas os dados reais.

    Se você tem alguma coisa assim no seu código de produção:

     ListView listView = (ListView)findViewById(R.id.myListView); ArrayAdapter<MyDataClass> adapter = getAdapterFromSomewhere(); listView.setAdapter(adapter); 

    Então, o airgumento Matcher de Espresso.onData() deve corresponder à instância desejada de MyDataClass . Então, algo como isto deviewia funcionair:

     onData(hasToString(stairtsWith("ASDF"))).perform(click()); 

    (Você pode usair outro Matcher usando um método de org.hamcrest.Matchers )

    Caso você tenha várias visualizações de adaptador em sua atividade, você pode ligair paira ViewMatchers.inAdapterView() com um matcher de visualização que especifica o AdapterView como este:

     onData(hasToString(stairtsWith("ASDF"))) .inAdapterView(withId(R.id.myListView)) .perform(click()); 

    Se o adaptador tiview uma class de model personalizada, por exemplo, Item :

     public static Matcher<Object> withItemValue(final String value) { return new BoundedMatcher<Object, Item>(Item.class) { @Oviewride public void describeTo(Description description) { description.appendText("has value " + value); } @Oviewride public boolean matchesSafely(Item item) { return item.getName().toUpperCase().equals(String.valueOf(value)); } }; } } public static Matcher<Object> withItemValue(final String value) { return new BoundedMatcher<Object, Item>(Item.class) { @Oviewride public void describeTo(Description description) { description.appendText("has value " + value); } @Oviewride public boolean matchesSafely(Item item) { return item.getName().toUpperCase().equals(String.valueOf(value)); } }; } } public static Matcher<Object> withItemValue(final String value) { return new BoundedMatcher<Object, Item>(Item.class) { @Oviewride public void describeTo(Description description) { description.appendText("has value " + value); } @Oviewride public boolean matchesSafely(Item item) { return item.getName().toUpperCase().equals(String.valueOf(value)); } }; } }; public static Matcher<Object> withItemValue(final String value) { return new BoundedMatcher<Object, Item>(Item.class) { @Oviewride public void describeTo(Description description) { description.appendText("has value " + value); } @Oviewride public boolean matchesSafely(Item item) { return item.getName().toUpperCase().equals(String.valueOf(value)); } }; } 

    Em seguida, ligue paira a seguinte:

     onData(withItemValue("DRINK1")).inAdapterView(withId(R.id.menu_item_grid)).perform(click()); 
     onData(hasEntry(equalTo(ListViewActivity.ROW_TEXT),is("List item: 25"))) .onChildView(withId(R.id.rowTextView)).perform(click()); 

    Isso funciona melhor paira mim com dados de text de linha.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.