ViewPager中的Espresso Recylerview匹配多个视图

如何使用实现具有匹配多个视图的ID的RecylerView的片段来定位Viewpager?

我有一个MainActivity,它有一个Viewpager。 Viewpager有5个标签。 在这5个选项卡中,我使用RecylerViews在每个选项卡中加载图像。

RecylerView XML在不同的片段中重复使用,因此当使用Espresso访问它时,它会保持抱怨ID匹配多个视图。

 

我的RecylerView不加载任何文本,只加载图像,所以我甚至不能用withText("Text here") 。 我也不能对RecylerViews使用onData()

 @RunWith(AndroidJUnit4.class) @LargeTest public class ExampleTest { @Rule public ActivityTestRule mActivityRule = new ActivityTestRule( MainActivity.class); Activity activity = mActivityRule.getActivity(); @Test public void ExampleMethod() { // perform a swipe onView(withId(R.id.viewpager)).perform(swipeLeft()); // try to click on one of the recycler view items. // this crashes: onView(withId(R.id.recycler_view)) .perform(RecyclerViewActions.actionOnItemAtPosition(2, click())); } } 

所以它崩溃并指出错误

android.support.test.espresso.AmbiguousViewMatcherException:’with id:com.example.app:id / recycler_view’匹配层次结构中的多个视图。 问题视图标有以下“**** MATCHES ****”。

//列出不同的层次结构

 View Hierarchy: View Hierarchy: +>DecorView{id=-1, visibility=VISIBLE, width=720, height=1280, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1} //... 

我在使用ViewPager时遇到了同样的问题,并且将isDisplayed()子句添加到ViewMatcher为我解决了ViewMatcher问题(不过,与Espresso中的所有内容一样,它有时会很ViewMatcher )…

 onView(allof(isDisplayed(), withId(R.id.recycler_view))) .perform(RecyclerViewActions.actionOnItemAtPosition(2, click())); 

我所做的是为每个片段设置不同的内容描述,Espresso支持hasContentDescription()withContentDescription()