android - Espresso 获取 recyclerView 的项目以执行操作
问题描述
我正在尝试检查我的 recyclerView 项目的背景颜色,正在工作,但我不喜欢我这样做的方式,因为我强制点击获取它,有没有其他方法可以做到这一点表演?
Uiview.perform(
RecyclerViewActions.actionOnItemAtPosition<RecyclerView.ViewHolder>(
position,
click()
)
).apply {
withBackgroundColor(color)
}
withBackgroundColor 方法是:
private fun withBackgroundColor(@ColorInt color: Int): Matcher<RecyclerView.ViewHolder> {
return object :
BoundedMatcher<RecyclerView.ViewHolder, RecyclerView.ViewHolder>(
RecyclerView.ViewHolder::class.java
) {
override fun matchesSafely(item: RecyclerView.ViewHolder): Boolean {
return (item.itemView.background as ColorDrawable).color == color
}
override fun describeTo(description: Description) {
}
}
}
正如我所说,它有效,但我不得不单击以获取该项目......
解决方案
我认为您的Uiview.perform(...)
电话不是在检查背景颜色。如果我假设Uiview.perform(...)
与 相同onView(...).perform(...)
,并返回 a ViewHolder
,那么后续apply
将是“孤立的” - 除了单击该项目之外它不会做任何其他事情,这可能是您看到测试通过的原因。
否则,您可以简单地创建自己的自定义RecyclerView
匹配器以及您的ViewHolder
:
fun <VH : RecyclerView.ViewHolder> hasHolderItemAtPosition(position: Int, matcher: Matcher<VH>): Matcher<View> {
return object : BoundedMatcher<View, RecyclerView>(RecyclerView::class.java) {
override fun describeTo(description: Description) {
description.appendText("has holder item: ")
matcher.describeTo(description)
description.appendText(" at position: $position")
}
override fun matchesSafely(view: RecyclerView): Boolean {
return view.adapter?.let {
val type = it.getItemViewType(position)
val holder = it.createViewHolder(view, type)
it.onBindViewHolder(holder, position)
return matcher.matches(holder)
} ?: false
}
}
}
然后使用背景颜色执行检查:
onView(your_recycler_view)
.check(matches(hasHolderItemAtPosition(position, withBackgroundColor(color))))
推荐阅读
- excel - Excel VBA:将活动工作表另存为 PDF
- firebase - 没有用户的在线商店中的 Firebase 规则
- apache-flink - 如何使用眨眼规划器从缩回流中插入缩回水槽
- python - 在从另一个列值派生的数据框中设置计算的列值
- python - 如何在python中映射一个列表和字典
- python - Python TypeError:列表索引必须是整数,而不是str
- python - 动态更新 Holoviz 面板布局
- matlab - 如何构建 2 层模糊推理系统
- powershell - 有没有办法有条件地/动态地将管道添加到 cmdlet?
- css - 为什么页脚样式会被截断?