我正在为我的应用程序编写浓缩咖啡测试。对于一项测试,我必须单击RecyclerView-Item上的一个按钮。该项目大于屏幕,因此,当我滚动到该项目时,所需的按钮仍不会显示(这是必需的,因此我可以单击它)。
我尝试使用滚动到视图
onView(withId(R.id.recycler_view)).perform(scrollTo<MyViewHolder>(hasDescendant(withId(R.id.target_button))))
,但这只是滚动到包含按钮的项目的顶部。由于按钮位于该项目的最底部,并且该项目大于屏幕,因此当我尝试单击该按钮时,我会得到
Action will not be performed because the target view does not match one or more of the following constraints:
at least 90 percent of the view's area is displayed to the user.
我也尝试过
onView(withId(R.id.recycler_view)).perform(actionOnItemAtPosition<MyViewHolder>(0, EspressoUtils.clickChildViewWithId(R.id.target_button)))
其中EspressoUtils.clickChildViewWithId(id: Int)
是this问题的公认答案中描述的内容。这也产生了相同的错误。如何滚动到RecyclerView-Item中的特定子项?
答案 0 :(得分:1)
在单击RecyclerView项内的视图(是屏幕的两倍)时,以下解决方案对我有用。注意:我正在单击的视图实际上不在屏幕上,但是由于它在视图层次结构中,因此可以单击它。
创建自定义ViewAction:
private fun clickChildViewWithId(id: Int) = object : ViewAction {
override fun getConstraints() = null
override fun getDescription() = "click child view with id $id"
override fun perform(uiController: UiController, view: View) {
val v = view.findViewById<View>(id)
v.performClick()
}
}
用法:
onView(withId(R.id.recycler_view))
.perform(actionOnItemAtPosition<MyViewHolder>(0, clickChildViewWithId(R.id.target_button)))