Espresso在Recyclerview项目中执行点击视图

问题描述 投票:0回答:3

我尝试了所有操作以在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()));

但是它给了我相同的信息->多个匹配问题

有人帮助,我真的尝试了一切

java android android-recyclerview android-espresso
3个回答
1
投票
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))
    }
}

1
投票

该错误表示它找到了ID为R.id.ticket_list_list的多个视图。在您提供的错误消息之后,还应该有一个视图层次结构日志,其中显示了Espresso找到的具有相同ID并标有****MATCHES****的视图。


0
投票

几天前我也遇到了同样的问题,但最终从StackOverflow获得了解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.