我尝试了一切以执行recyclerview项目中的单击视图,但未成功。阅读Internet上的所有选项并进行尝试,但仍然无法正常工作。我最近用过:
onView(ViewMatchers.withId(R.id.live_rw_liveMatchList))
.perform(RecyclerViewActions.actionOnItemAtPosition(2, MyViewAction.clickChildViewWithId(R.id.pick_pw_pickLeft)));
但是我得到的只是:
android.support.test.espresso.AmbiguousViewMatcherException:'具有ID: hr.psk.android:id/ticket_list_list'匹配 层次结构。问题视图下方带有“ **** MATCHES ****”标记。
它仅匹配一个视图(我的recyclerview有13个孩子)
我知道这应该起作用,但是在我的项目中不起作用。尝试仅单击其他recyclerview中的recyclerviw项目,以使其更简单,例如:
onView(withId(R.id.ticket_list_list))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
但是它给了我相同的信息->多个匹配问题
有人帮助,我真的尝试了一切
答案 0 :(得分:0)
几天前我也遇到了同样的问题,但最终从StackOverflow获得了解决方案。
如果要单击回收者自定义项目视图,请单击,然后在项目中实现以下代码
您需要用Java编写此代码,这将对您有很大帮助,并节省了时间
ClickOnButtonView是控制列表项中发生的视图操作,并且 UiController类可帮助您找到自定义行项目
代码用科特林
编写@RunWith(AndroidJUnit4::class)
class CampaignFragmentTest {
@get: Rule
val activityTestRule = ActivityTestRule(TestActivity::class.java)
@Test
fun testCustomListClick() {
clickOnButtonAtRow(0)
}
}
private fun clickOnButtonAtRow(position: Int) {
Espresso.onView(ViewMatchers.withId(R.id.list)).perform(RecyclerViewActions.actionOnItemAtPosition<RecyclerView.ViewHolder>
(position, ClickOnButtonView()))
}
inner class ClickOnButtonView : ViewAction {
internal var click = ViewActions.click()
override fun getConstraints(): Matcher<View> {
return click.constraints
}
override fun getDescription(): String {
return " click on custom button view"
}
override fun perform(uiController: UiController, view: View) {
//btnClickMe -> Custom row item view button
click.perform(uiController, view.findViewById(R.id.btnClickMe))
}
}
答案 1 :(得分:0)
该错误意味着它找到了ID为R.id.ticket_list_list
的多个视图。在您提供的错误消息之后,还应该有一个视图层次结构日志,其中显示了Espresso找到的,具有相同****MATCHES****
标识的视图。
因此,您可以通过提供以下另一个ViewMatcher来更改要测试的视图的ID或定位该视图:
onView(allOf(withId(recyclerViewID), viewMatcher))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
答案 2 :(得分:0)
onView(withId(R.id.ticket_list_list))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
您得到的错误意味着在某处还有另一个使用ID ticket_list_list
的视图ticket_list_list是否是您的实际列表视图?(您要单击的内容的父项)
如果是它是屏幕上唯一的一个吗?如果是,则使用以下内容
onView(allOf(withId(R.id.ticket_list_list), isDisplayed()))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
通过添加isDisplayed()匹配器,可以仅定位显示的内容,而忽略那些已存在但未显示的内容,从而使目标视图更加具体
如果确实显示了另一个匹配项(或者上面的匹配项对您不起作用),则该ID与您要匹配的匹配项相同,请使用以下
onView(allOf(withId(R.id.ticket_list_list), withParentIndex(index_of_matcher_here)))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
应该更具体地定位而不是具有ParentIndex(some_number)的isDisplayed(),并为您提供具有您要查找的ID及其索引的视图
在上述情况仍然无法解决的非常混乱的情况下,可能是因为所有返回的View都具有相同的索引,可能是因为它们是另一个View的子代,所以您可以发挥创意并做类似的事情
onView(allOf(withId(R.id.ticket_list_list), withParent(allOf(withId(if_of_the_parent), withParentIndex(index_of_matcher_here)))))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
代替指定父级的索引。
只需按照自己的方式混合使用'n,只需确保不要对Matchers发疯,并保持可读性
尽可能少地使用(确保它也是可读性和可维护性,而不仅仅是由索引组成),您并不想获取导弹目标的坐标-您只需要查看