该错误表示它找到了ID为R.id.ticket_list_list
的多个视图。在您提供的错误消息之后,还应该有一个视图层次结构日志,其中显示了Espresso找到的具有相同ID并标有****MATCHES****
的视图。
我尝试了所有操作以在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()));
但是它给了我相同的信息->多个匹配问题
有人帮助,我真的尝试了一切
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与您要匹配的ID相同,则使用以下代码onView(allOf(withId(R.id.ticket_list_list), withParentIndex(index_of_matcher_here))) .perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
而不是isDisplayed()withParentIndex(some_number)应该更具体地定位并为您提供具有您要查找的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()));
而是指定父级的索引。
只要按照自己的方式进行混合,就可以确保不要对匹配器发疯,并且保持可读性
尽可能少地使用(确保它也是可读性和可维护性,而不仅仅是由索引组成),您不是在尝试获取导弹目标的坐标-您只需要查看]]
该错误表示它找到了ID为R.id.ticket_list_list
的多个视图。在您提供的错误消息之后,还应该有一个视图层次结构日志,其中显示了Espresso找到的具有相同ID并标有****MATCHES****
的视图。
因此,您可以通过提供另一个ViewMatcher来更改要测试的视图的ID或将视图定位为目标,如下所示:
onView(allOf(withId(recyclerViewID), viewMatcher))
.perform(RecyclerViewActions.actionOnItemAtPosition(0, click()));
几天前我也遇到了同样的问题,但最终从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))
}
}
该错误表示它找到了ID为R.id.ticket_list_list
的多个视图。在您提供的错误消息之后,还应该有一个视图层次结构日志,其中显示了Espresso找到的具有相同ID并标有****MATCHES****
的视图。
几天前我也遇到了同样的问题,但最终从StackOverflow获得了解决方案。