使用 Espresso 单击 RecyclerView 项目内的视图

新手上路,请多包涵

如何使用 Espresso 单击 RecyclerView 项目内的特定视图?我知道我可以使用以下方法单击位置 0 处的项目:

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

但我需要单击该项目内的特定视图而不是项目本身。

- 编辑 -

更准确地说:我有一个 RecyclerView ( R.id.recycler_view ),其中的项目是 CardView ( R.id.card_view )。在每个 CardView 中,我有四个按钮(除其他外),我想点击一个特定的按钮( R.id.bt_deliver )。

我想使用 Espresso 2.0 的新功能,但我不确定是否可行。

如果不可能,我想使用这样的东西(使用 Thomas Keller 代码):

 onRecyclerItemView(R.id.card_view, ???, withId(R.id.bt_deliver)).perform(click());

但我不知道在问号上加什么。

原文由 Filipe Ramos 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 456
2 个回答

您可以使用自定义视图操作来做到这一点。

 public class MyViewAction {

    public static ViewAction clickChildViewWithId(final int id) {
        return new ViewAction() {
            @Override
            public Matcher<View> getConstraints() {
                return null;
            }

            @Override
            public String getDescription() {
                return "Click on a child view with specified id.";
            }

            @Override
            public void perform(UiController uiController, View view) {
                View v = view.findViewById(id);
                v.performClick();
            }
        };
    }

}

然后你可以点击它

onView(withId(R.id.rv_conference_list)).perform(
            RecyclerViewActions.actionOnItemAtPosition(0, MyViewAction.clickChildViewWithId(R.id. bt_deliver)));

原文由 blade 发布,翻译遵循 CC BY-SA 3.0 许可协议

现在有了 android.support.test.espresso.contrib 它变得更容易了:

1)添加测试依赖

androidTestCompile('com.android.support.test.espresso:espresso-contrib:2.0') {
    exclude group: 'com.android.support', module: 'appcompat'
    exclude group: 'com.android.support', module: 'support-v4'
    exclude module: 'recyclerview-v7'
}

*排除 3 个模块,因为您很可能已经拥有它

2)然后做类似的事情

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

要么

onView(withId(R.id.recyclerView))
  .perform(RecyclerViewActions.actionOnItem(
            hasDescendant(withText("whatever")), click()));

要么

onView(withId(R.id.recycler_linear))
            .check(matches(hasDescendant(withText("whatever"))));

原文由 Andrew 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题