Android Espresso ListView 点击项
Posted
技术标签:
【中文标题】Android Espresso ListView 点击项【英文标题】:Android Espresso ListView click item 【发布时间】:2015-01-19 07:33:46 【问题描述】:我有带有图片和文字的ListView
。当我尝试单击项目时,出现错误
android.support.test.espresso.AmbiguousViewMatcherException: 'with id: com.cifrasoft.telefm:id/cardsGridView' matches multiple views in the hierarchy.
Problem views are marked with '****MATCHES****' below.
我使用以下代码:
onData(hasToString(startsWith("Item Text")))
.inAdapterView(withId(R.id.cardsGridView))
.perform(click());
我可以使用Adapter
的位置点击ListView
,没有匹配或startWith
吗?
【问题讨论】:
这意味着您在视图层次结构中有多个具有命名 ID 的视图。您可以发布整个错误消息吗? 是的,当然。但是完整的错误太长了。pastebin.com/eahDGDMb 从整个层次结构来看,您似乎有一个 ViewPager,它显示了多个页面,其中三个具有带有 ID cardsGridView 的 AdapterView。因此,您有一个 AdapterView,即 ViewPager,以及另一个嵌套的 AdapterView,即您的 ListView。可行的方法是给从 Adapter.getView 返回的视图单独的 ID 或标签,并在 inAdapterView() 调用中使用 isDescendantOf() 匹配器和 withId。 haffax,你能给出代码的例子吗?没找到? 【参考方案1】:尝试使用 atPosition()。例如
onData(hasToString(startsWith("Item Text")))
.inAdapterView(withId(R.id.cardsGridView)).atPosition(0)
.perform(click());
索引为 0 时,它将点击找到的第一个匹配视图。
【讨论】:
【参考方案2】:使用Record Test获取列表的ViewInteraction然后获取视图并使用performItemClick如下:
AtomicReference<ListView> resultView = new AtomicReference<>(null);
ViewInteraction viewInteraction1 = onView( ... withId(R.id.my_list_id), ...);
viewInteraction1.check(((view, noViewFoundException) ->
if(noViewFoundException != null)
return;
resultView.set((ListView) view);
));
if(resultView.get() != null)
ListView listView = resultView.get();
activity.runOnUiThread(()->
listView.performItemClick(
listView.getAdapter().getView(index, null,null),
index,
listView.getAdapter().getItemId(index));
);
【讨论】:
【参考方案3】:试试这个:
onView(withText("ListItemText")).perform(ViewActions.click());
【讨论】:
以上是关于Android Espresso ListView 点击项的主要内容,如果未能解决你的问题,请参考以下文章
Espresso 如何点击一个 ImageView 放置在 listview 的第一项?
Espresso - 如何定位并单击ListView中的第一个项目
有没有办法用 Espresso 测试 Chrome 自定义标签?
Android的报错提示:Failed to resolve: com.android.support.test.espresso:espresso-core:3.0.2