Android Espresso:在每个选项卡中使用 RecyclerViews 滑动选项卡

Android Espresso: Sliding Tabs with RecyclerViews in every tab

我有一个滑动标签应用程序,每个标签中都有 recyclerview。 我正在使用 Android Espresso 测试应用程序。我想点击其中一个 recyclerview 项目。当我这样做时:

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

我得到这个异常:

android.support.test.espresso.AmbiguousViewMatcherException: 'with id: com.uriel.frankel:id/recyclerView' matches multiple views in the hierarchy.

有什么想法吗?

嗯,我猜你在你的选项卡中为每个 RecyclerView 使用相同的 xml 文件。因此,您所有的 RecyclerView's 都具有相同的 ID。所以您不能使用您的 ID 来引用您的 RecyclerView's

因此,要么给每个 RecyclerView 一个自己的 ID,要么尝试使用任何其他 ViewMatcher(例如 withText("any specific text in your recyclers"))进行搜索。 Here 您可能会找到适合您情况的方法。

我建议创建 ViewHolder 匹配器来匹配 RecyclerView 中的特定项目。然后你就可以像 scrollToHolder(...) 一样使用 PositionableRecyclerViewAction 例如:

public static Matcher<RecyclerView.ViewHolder> withMessageSubjectInViewHolder(String itemSubject) {
        Checks.checkNotNull(itemSubject);
        return new BoundedMatcher<RecyclerView.ViewHolder,
                MyRecyclerViewItemAdapter.MyViewHolder>(MyRecyclerViewItemAdapter.MyViewHolder.class) {
            @Override
            public boolean matchesSafely(MyRecyclerViewItemAdapter.MyViewHolder holder) {
                boolean isMatches = false;

                if (!(holder.subject == null)) {
                    isMatches = ((itemSubject.equals(holder.subject.getText().toString()))
                            && (holder.subject.getVisibility() == View.VISIBLE));
                }
                return isMatches;
            }

            @Override
            public void describeTo(Description description) {
                description.appendText("with message subject: " + itemSubject);
            }
        };
    }

这就是我的使用方式:

onView(withId(R.id.my_recycler_view_id)).perform(scrollToHolder(withMessageSubjectInViewHolder(unique_message_subject)));
onView(withText(unique_message_subject)).check(matches(isDisplayed())).perform(click());