2016-06-09 1 views
3

Мне интересно, как я смогу найти конкретный элемент в представлении ресайклера, где порядок элементов будет рандомизирован в каждом прогоне.Espresso - как найти определенный элемент в представлении ресайклера (случайный случай)

Предположим, у меня есть 4 элемента в представлении ресайклера, каждый из которых представлен одним и тем же видом держателя вида с текстовым видом в нем. Уникальный заголовок применяется к каждому держателю/элементу представления. Для этого примера предположим, что названия для простоты - «A», «B», «C» и «D».

Как бы найти позицию (и затем щелкнуть) элемент «А», если порядок рандомизирован? Я знаю, если порядок не изменится, я мог бы выполнить действие scrollToPosition RecyclerViewInteraction, но в этом случае порядок может и изменится.

Любые мысли?

Спасибо, Zach

+1

не рандомизации детали, или, вернее, рандомизации то предсказуемым образом. Вы можете использовать одно и то же семя каждый раз в своем случайном генераторе, чтобы убедиться, что предметы находятся там, где вы их ищете. – njzk2

+0

Предположим, что порядок элементов не может контролироваться разработчиком. В идеальном мире, да, заданный порядок (или предсказуемый порядок, как вы предлагаете) является идеальным. Для этого сценария это невозможно. – Zach

ответ

3

Я был в состоянии получить эту работу, выполнив следующие действия:

Matcher<RecyclerView.ViewHolder> matcher = CustomMatcher.withTitle("A"); 
onView((withId(R.id.recycler_view))).perform(scrollToHolder(matcher), actionOnHolderItem(matcher, click())); 

Где CustomMatcher.withTitle является:

public static Matcher<RecyclerView.ViewHolder> withTitle(final String title) 
{ 
    return new BoundedMatcher<RecyclerView.ViewHolder, CustomListAdapter.ItemViewHolder>(CustomListAdapter.ItemViewHolder.class) 
    { 
     @Override 
     protected boolean matchesSafely(CustomListAdapter.ItemViewHolder item) 
     { 
      return item.mTitleView.getText().toString().equalsIgnoreCase(title); 
     } 

     @Override 
     public void describeTo(Description description) 
     { 
      description.appendText("view holder with title: " + title); 
     } 
    }; 
} 
-2

Использование Espresso.onData с помощью пользовательского просмотра Искателя. Google example

Я использовал то, что можно было бы адаптировать, как это для Вашего случая:

onData(new BaseMatcher<String>() { 
     @Override 
     public void describeTo(Description description) { 
      // what? 
      description.appendText("Matches A"); 
     } 

     @Override 
     public boolean matches(Object item) { 
      return item instanceof String && ((String) item).equals("A"); 
     } 
    }).perform(click()); 

Вы можете заменить String любым ваш тип модели, если оно является более сложным, чем это, а также использовать встроенные в матчи, если это просто (этот случай можно упростить на onData(is("A")).perform(click())).

+0

Похоже на хороший подход, но я получаю сообщение об ошибке: 'android.support.test.espresso.NoMatchingViewException: никакие представления в иерархии не найдены: присваивается классу: class android.widget.AdapterView' – Zach

+1

Ах, я не думаю, что onData может использоваться для просмотров с использованием recycler, это правильно? – Zach

+1

правый. Я бы подумал, что это сработало. вот это: https://stackoverflow.com/questions/27396583/how-to-click-on-an-item-inside-a-recyclerview-in-espresso – njzk2