意式浓缩咖啡 – 点击列表视图中的文字

我正尝试使用Espresso单击列表视图中的文本。 我知道他们有这个指南 ,但我看不到如何通过查找文本来完成这项工作。 这是我所尝试过的

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

正如所料,这没有奏效。 错误表示在层次结构中没有视图。 有谁知道如何select一个string? (在这种情况下"ASDF" )预先感谢。

由于@haffax而更新

我收到错误:

com.google.android.apps.common.testing.ui.espresso.AmbiguousViewMatcherException:'可从类中分配:类android.widget.AdapterView'匹配层次结构中的多个视图。

第二个错误

用这个代码

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

我得到这个错误

com.google.android.apps.common.testing.ui.espresso.PerformException:在内容描述中执行“视图加载适配器数据”时出错:是“MapList”。

引起:java.lang.RuntimeException:找不到匹配的数据:asString(以“ASDF”开头的string)


昂达(任何())。inAdapterView(withContentDescription( “降序”))。atPosition(X).perform(点击())

Solutions Collecting From Web of "意式浓缩咖啡 – 点击列表视图中的文字"

问题是,你试图将列表视图本身与instanceOf(ListView.class)匹配为onData()参数。 onData()需要一个数据匹配器来匹配ListView的适配数据,而不是ListView本身,也不是Adapter.getView()返回的View ,而是实际的数据。

如果你在生产代码中有这样的东西:

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

然后Espresso.onData()的Matcher参数应该匹配MyDataClass所需的实例。 所以,这样的事情应该工作:

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

(你可以使用org.hamcrest.Matchers的方法使用另一个匹配器)

如果您的活动中有多个适配器视图,则可以使用视图匹配器来调用ViewMatchers.inAdapterView() ,该视图匹配器指定AdapterView,如下所示:

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

如果适配器有自定义模型类例如Item

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

然后拨打以下电话

 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()); 

这对于行文本数据最适合我