Android Espresso-预成型点击RecyclerView中具有指定文本的项目

Android Espresso-预成型点击RecyclerView中具有指定文本的项目,android,android-recyclerview,android-espresso,Android,Android Recyclerview,Android Espresso,我有一个RecyclerView,其中包含代表可用插槽的项目。让我们假设这些插槽代表戏剧场景。每个插槽都有一个可用票证的数量n,可以处于打开或关闭状态。如果一个槽是打开的,它包含一个文本打开的TextView,我可以点击它,我将被重定向到购票流程。否则,如果我的插槽关闭,它将被禁用,并且我无法单击它(文本在TextView上关闭) 如何测试以下场景: 从RecyclerView中选择具有打开插槽的任何插槽 执行单击 验证是否已将我重定向到购票流程 我试过使用: onView(withId(R.i

我有一个RecyclerView,其中包含代表可用插槽的项目。让我们假设这些插槽代表戏剧场景。每个插槽都有一个可用票证的数量n,可以处于打开关闭状态。如果一个槽是打开的,它包含一个文本打开的
TextView
,我可以点击它,我将被重定向到购票流程。否则,如果我的插槽关闭,它将被禁用,并且我无法单击它(文本在
TextView
上关闭)

如何测试以下场景:

  • 从RecyclerView中选择具有打开插槽的任何插槽
  • 执行单击
  • 验证是否已将我重定向到购票流程
  • 我试过使用:

    onView(withId(R.id.recycler_view))
        .perform(
          RecyclerViewActions.actionOnItemAtPosition(10, click()) // <-- only position
    );
    
    onView(带id(R.id.recycler\u视图))
    .表演(
    
    RecycleServiceActions.ActionOnItemPosition(10,click())/使用
    actionOnItem()
    ,您走上了正确的轨道

    要使
    actionItem()
    正常工作,您需要做两件事

  • recyclerview的资源id。看起来您已经在
    R.id.recycler\u视图中拥有了它
  • 您希望
    对其执行
    查看操作
    的特定类型的
    ViewHolder
    (例如
    click()
    )。您应该能够在应用程序代码中定义RecyclerView的任何位置找到它
  • 一旦你有了这两样东西,你就可以告诉Espresso先找到recyclerview,然后扫描其中的视图持有者,以匹配你传入的任何匹配者

    示例:

    // Step 1: Tell espresso which RecyclerView we're working with
    onView(withId(R.id.recycler_view))
        // Step 2: Tell espresso which ViewHolder Type to look for inside the RecyclerView
        .perform(
            RecyclerViewActions.actionOnItem<TheaterSpectacleAdapter.ViewHolder>(
            // Step 3: Using a ViewMatcher, tell espresso what viewholder you want to act on
                ViewMatchers.withText("OPEN"),
                // Step 4: using a ViewAction, tell Espresso what you want to do with this ViewHolder
                ViewActions.click()
            )
        )
    
    像这样使用它

                // Step 3: Using a ViewMatcher, tell espresso what viewholder you want to act on
                first(ViewMatchers.withText("OPEN")),
    
    哈哈,事实上……想想看……因为您的特定测试场景是“选择任何一个打开的插槽”……您可能会逃过一劫

    onView(first(withText("OPEN")).perform(click())
    
    但是,如果测试变得更复杂,您将享受能够更具体地了解您想要使用的视图持有者的灵活性


    希望这两个答案中的一个能起作用!

    这是用“打开”单击文本视图的代码

    假设购票流是一项新活动,请检查是否激发了意图

    intended(hasComponent(Buy_Ticket_Flow.class.getName()));
    
            onView(allOf(withId(R.id.recycler_view), isDisplayed()))
                .perform(actionOnItem(withChild(withText("OPEN")), click()));
    
    intended(hasComponent(Buy_Ticket_Flow.class.getName()));