Android 浓缩咖啡测试 - 测试回收器视图项目内的视图是否可见



我有一个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()))

最新更新