RecyclerView espresso 测试 click() 不工作

Posted

技术标签:

【中文标题】RecyclerView espresso 测试 click() 不工作【英文标题】:RecyclerView espresso test click() not working 【发布时间】:2016-01-27 10:05:27 【问题描述】:

我遇到了奇怪的浓缩咖啡仪器测试行为。单击回收站视图的项目不起作用。

此处未发生点击

onView(withId(R.id.recyclerView)).perform(actionOnItemAtPosition(0, click()));

但这种解决方法有效

onView(withId(R.id.recyclerView)).perform(actionOnItemAtPosition(0, recyclerClick()));

// ...

public static ViewAction recyclerClick() 
    return new ViewAction() 

        @Override
        public Matcher<View> getConstraints() 
            return any(View.class);
        

        @Override
        public String getDescription() 
            return "performing click() on recycler view item";
        

        @Override
        public void perform(UiController uiController, View view) 
            view.performClick();
        
    ;

这是 Espresso 或 RecyclerView 的问题吗?

【问题讨论】:

两者都不是; espresso 根本不“知道”如何点击回收站视图。一旦你为它提供了一个 howto 实现,它就知道了,而且它工作了。如果第二种方法不起作用,那将是一个问题;) 你试过用onData代替onView吗? 正如我们在官方文档中看到的 Espresso.onData() Use this method to load (into the view hierarchy) items from AdapterView widgets (e.g. ListView). RecyclerView 扩展 ViewGroup。所以onData()不能和它一起使用。 【参考方案1】:

应该与RecyclerView 无关。 Espresso 通过其ViewActions.click() 实现所做的是将MotionEvent 发送到目标视图的中心。确保没有孩子拦截它。

【讨论】:

看来你是对的。 Espresso 在屏幕上点击,但没有在视图中模拟 performClick()。似乎项目中间的一些视图拦截了点击。【参考方案2】:

您可以使用RecyclerViewActions

只需使用:

onView(withId(R.id.recyclerView)).perform(
            RecyclerViewActions.actionOnItemAtPosition(0, click()));

例如:

@RunWith(androidJUnit4.class)
public class MainActivityTest 
  @Rule
  public ActivityTestRule<MainActivity> activityRule = new ActivityTestRule<>(MainActivity.class);

  @Test
  public void clickItem() 
    onView(withId(R.id.recycler_view))
        .perform(RecyclerViewActions.actionOnItemAtPosition(o, click()));

    onView(withId(R.id.text))
        .check(matches(withText("XX")))
        .check(matches(isDisplayed()));
  

【讨论】:

嗨。这实际上是第一个被剪断的问题。这里的问题是Espresso.click() 没有效果。虽然自定义 ViewActionview.performClick() 有效。 您在适配器中的哪个视图中定义了 onClickListener ?

以上是关于RecyclerView espresso 测试 click() 不工作的主要内容,如果未能解决你的问题,请参考以下文章

Espresso Test 6: RecyclerView

如何让 Espresso 单击特定的 RecyclerView 项目?

Espresso Nested Recycler Views UI 测试

用于嵌套 RecyclerView 的 Espresso Matcher

Espresso,当 NestedScrollView 或 RecyclerView 在 CoordinatorLayout 中时滚动不起作用

recyclerView的用法