Как настроить таргетинг на Viewpager с помощью фрагмента, который реализует RecylerView с идентификатором, соответствующим нескольким представлениям?
У меня есть MainActivity, у которого есть Viewpager. Viewpager имеет 5 вкладок. На этих 5 вкладках я использую RecylerViews для загрузки изображений в каждом из них.
XML RecylerView повторно используется в разных фрагментах, поэтому при доступе к нему с помощью Espresso он продолжает жаловаться на идентификатор, соответствующий нескольким представлениям.
<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent"/>
Мой RecylerView не загружает какой-либо текст, загружает только изображения, поэтому я даже не могу сделать withText("Text here")
. Я не могу использовать onData()
для RecylerViews.
@RunWith(AndroidJUnit4.class) @LargeTest public class ExampleTest { @Rule public ActivityTestRule<MainActivity> mActivityRule = new ActivityTestRule<>( MainActivity.class); Activity activity = mActivityRule.getActivity(); @Test public void ExampleMethod() { // perform a swipe onView(withId(R.id.viewpager)).perform(swipeLeft()); // try to click on one of the recycler view items. // this crashes: onView(withId(R.id.recycler_view)) .perform(RecyclerViewActions.actionOnItemAtPosition(2, click())); } }
Поэтому он падает и указывает на ошибку
Android.support.test.espresso.AmbiguousViewMatcherException: 'с id: com.example.app:id/recycler_view' соответствует нескольким представлениям в иерархии. Представления задач отмечены «**** MATCHES ****» ниже.
// Список различных иерархий
View Hierarchy: View Hierarchy: +>DecorView{id=-1, visibility=VISIBLE, width=720, height=1280, has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=false, is-enabled=true, is-focused=false, is-focusable=false, is-layout-requested=false, is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0, child-count=1} //...
Я столкнулся с той же проблемой при использовании ViewPager
, и добавление предложения isDisplayed()
в ViewMatcher
разрешило его для меня (хотя, как и все в Espresso, время от времени оно может быть неровным) …
onView(allof(isDisplayed(), withId(R.id.recycler_view))) .perform(RecyclerViewActions.actionOnItemAtPosition(2, click()));
То, что я сделал, заключалось в том, чтобы установить различное описание содержимого для каждого фрагмента, а Espresso поддерживает hasContentDescription()
и withContentDescription()
…