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());
我有一个滑动标签应用程序,每个标签中都有 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());