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