4

Как настроить таргетинг на Viewpager с помощью фрагмента, который реализует RecylerView с идентификатором, соответствующим нескольким представлениям?Espresso Recylerview в ViewPager соответствует нескольким представлениям

У меня есть MainActivity, у которого есть Viewpager. Viewpager имеет 5 вкладок. В этих 5 вкладках я использую RecylerViews для загрузки изображений в каждом из них.

RecylerView XML повторно используется в разных фрагментах, поэтому при доступе к нему с помощью 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: 'with id: com.example.app:id/recycler_view' matches multiple views in the hierarchy. Problem views are marked with '****MATCHES****' below.

// Список различных иерархий

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} 

//... 

ответ

8

Я столкнулся с той же проблемой при использовании ViewPager, и добавив пункт isDisplayed() на ViewMatcher решил это для меня (хотя, как и все в эспрессо, оно может быть иногда отслаивающимся) ...

onView(allof(isDisplayed(), withId(R.id.recycler_view))) 
    .perform(RecyclerViewActions.actionOnItemAtPosition(2, click())); 
+0

Спасибо, но это не сработало. Ошибка: recycler_view и отображается на экране пользователю) 'соответствует нескольким представлениям в иерархии. –

+0

isDisplayed() сохранен мой день (у меня было несколько RecycleView для разных вкладок из TabLayout). – Shondeslitch

0

То, что я сделал, было установлено различное описание контента для каждого фрагмента, и Espresso поддерживает hasContentDescription() и withContentDescription() ...

Смежные вопросы