我有一个ID为'rv_list'的RecyclerView。单击任何RecyclerView项目时,每个项目内部都有一个视图,ID为">star"可见。
我想使用 expresso 检查这一点 - 单击第一个回收器视图项目,检查视图是否可见R.id.star。
我的代码是 -
@Test
fun checkIfStarVisibleOnItemClick() {
onView(withId(R.id.rv_list))
.perform(RecyclerViewActions.actionOnItemAtPosition<RepositoriesAdapter.RepositoriesViewHolder>(0, click()))
onView(withId(R.id.star))
.check(matches(isDisplayed()))
}
我收到此错误 -
id/star' 匹配层次结构中的多个视图
用于检查id
带有 'star' 的项目是否在 'rv_list'RecyclerView
的第一个元素(位置 0(中可见的代码应该是:
onView(withRecyclerView(R.id.rv_list)
.atPositionOnView(0, R.id.star))
.check(matches(isDisplayed()));
这种方法是Espresso-Contrig的一部分。
更新
现在我声明此方法:
fun nthChildOf(parentMatcher: Matcher<View?>, childPosition: Int): Matcher<View?>? {
return object : TypeSafeMatcher<View>() {
override fun describeTo(description: Description) {
description.appendText("with $childPosition child view of type parentMatcher")
}
override fun matchesSafely(view: View): Boolean {
if (view.parent !is ViewGroup) {
return parentMatcher.matches(view.parent)
}
val group = view.parent as ViewGroup
return parentMatcher.matches(view.parent) && group.getChildAt(childPosition) == view
}
}
}
并以此方式使用它:
onView(allOf(
withId(R.id.star),
isDescendantOfA(
nthChildOf(withId(R.id.rv_list), 0))
)).check(matches(isDisplayed()))