安卓Espresso: 在每个选项卡中使用滑动选项卡和RecyclerView的实现方法

4

我有一个滑动选项卡的应用程序,每个选项卡中都有一个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.

有什么想法吗?

为什么不直接为你的项目添加监听器? - Drilon Blakqori
你有一个带有Adapter的RecyclerView,该Adapter具有内部的ViewHoler类,对吧? - Drilon Blakqori
我在谈论使用Android Espresso进行UI单元测试。 - Uriel Frankel
1
哦,抱歉我错过了那一个。 - Drilon Blakqori
我的错误。我编辑了问题。 - Uriel Frankel
2个回答

1

嗯,我猜您在每个选项卡中都使用相同的xml文件。因此,所有RecyclerView都具有相同的ID。因此,您无法使用ID引用RecyclerView

因此,请为每个RecyclerView分配一个唯一的ID,或尝试使用任何其他ViewMatcher(例如withText("recyclers中的任何特定文本"))进行搜索。 在这里,您可以找到适用于您情况的方法。


0
我建议创建一个ViewHolder匹配器来匹配RecyclerView中的特定项。然后,您就可以使用PositionableRecyclerViewAction,例如scrollToHolder(...)
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());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接