浓缩咖啡在Recyclerview项目中执行单击视图

时间:2019-02-08 09:48:47

标签: java android android-recyclerview android-espresso

我尝试了一切以执行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()));

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

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

3 个答案:

答案 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发疯,并保持可读性

尽可能少地使用(确保它也是可读性和可维护性,而不仅仅是由索引组成),您并不想获取导弹目标的坐标-您只需要查看