AmbiguousViewMatcherException multiple RecyclerViews



我有一个包含RecyclerViewFragment。但是由于我在这个Fragment中有很多元素,我想向上滑动列表以查看和检查此Fragment中的所有元素。

早些时候这种方法帮助了我,但现在由于某种原因它不起作用:

Espresso.onView(ViewMatchers.withId(R.id.recyclerView)).perform(ViewActions.swipeUp())

我的项目中有许多具有相同id RecyclerView

<android.support.v7.widget.RecyclerView
    android:id="@+id/recyclerView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:scrollbars="vertical"/>

同样在我的测试中,我写了这样的东西:

onView(allOf( withId(R.id.recyclerView), isDisplayed()))
onView(withId(R.id.recyclerView)).perform(swipeUp())

但仅在第二行捕获错误。

android.support.test.espresso.AmbiguousViewMatcherException: 'with id: com.fentury.android:id/recyclerView' 匹配层次结构中的多个视图。 问题视图在下面标有"****匹配****"。

您的视图层次结构中有多个 id R.id.recyclerView的视图,因此浓缩咖啡无法执行正确的匹配。让这些RecyclerViewid独一无二。

<小时 />

onView(allOf(withId(R.id.recyclerView), isDisplayed())) onView(withId(R.id.recyclerView)).perform(swipeUp())

但仅在第二行捕获错误。

然后以这种方式执行匹配:

onView(allOf(withId(R.id.recyclerView), isDisplayed())).perform(swipeUp())

解决方案:

onView(allOf(withId(R.id.recyclerview), isDisplayed())).perform(swipeUp());

您应该对回收器视图的数据使用,您可以在其中使用回收器视图的 ID 以及它包含的数据类型进行断言。这应该有助于假设不同的回收器视图没有相同类型的数据,但更好的做法是根据其用途对不同的视图使用不同的 ID。

您可能还想使用 perform(ViewActions.scrollTo(((

当我发现这个问题时,我在ViewPager的两个片段中遇到了类似的问题。两个片段使用相同的布局文件,仅包含 id = @id/list 的回收器视图。

由于没有要匹配的父项,我制作了这个自定义 ViewMatcher 以匹配适配器类的列表:(Kotlin(

fun hasAdapterOfType(T: Class<out RecyclerView.Adapter<out RecyclerView.ViewHolder>>): BoundedMatcher<View, RecyclerView> {
    return object : BoundedMatcher<View, RecyclerView>(RecyclerView::class.java) {
        override fun describeTo(description: Description) {
            description.appendText("RecycleView adapter class matches " + T.name)
        }
        override fun matchesSafely(view: RecyclerView): Boolean {
            return (view.adapter.javaClass.name == T.name)
        }
    }
}

用法如下:

onView(allOf(withId(list), hasAdapterOfType(AccessAttemptListAdapter::class.java))).check(blabla)

最新更新