我的Fragment
包含RecyclerView
。但由于我在Fragment
中有很多元素,因此我想向上滑动列表以查看并检查此Fragment
中的所有元素。
此前此方法对我有所帮助,但由于某些原因它现在无效:
Espresso.onView(ViewMatchers.withId(R.id.recyclerView)).perform(ViewActions.swipeUp())
我的项目中有很多RecyclerView
个id
:
<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:&#39; id:com.fentury.android:id/recyclerView'匹配层次结构中的多个视图。 问题观点标有&#39; **** MATCHES ****&#39;下方。
答案 0 :(得分:3)
您的视图层次结构中有多个ID为R.id.recyclerView
的视图,因此espresso缺乏执行正确匹配的功能。使那些id
的{{1}}唯一。
RecyclerView
onView(allOf(withId(R.id.recyclerView), isDisplayed()))
但仅在第二行发现错误。
然后以这种方式进行匹配:
onView(withId(R.id.recyclerView)).perform(swipeUp())
答案 1 :(得分:0)
解决方案:
onView(allOf(withId(R.id.recyclerview), isDisplayed())).perform(swipeUp());
答案 2 :(得分:-1)
您应该使用数据进行回收站视图,您可以使用回收站视图的ID以及它所拥有的数据类型进行断言。这应该有助于假设不同的回收者视图不具有相同类型的数据,但更好的做法是根据其用途为不同的视图使用不同的ID。
您可能还想使用perform(ViewActions.scrollTo())
答案 3 :(得分:-1)
我在ViewPager中的两个片段中遇到了多个RecyclerViews的相同问题。两个片段使用相同的布局文件,仅包含带有id = @id / list的RecyclerView。
由于没有匹配的父级,我使用自定义ViewMatcher来匹配Adapter-Class的列表:(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)