Эспрессо - щелкните изображение внутри сетки

У меня есть иерархия представлений, как показано ниже:

GridView{id=2131362110, res-name=item_list_grid, 
|
+----->RelativeLayout{id=2131362124, res-name=item_image_thumb_layout
|
+------------->ImageView{id=2131362125, res-name=item_image
|
+----->RelativeLayout{id=2131362124, res-name=item_image_thumb_layout
|
+------------->ImageView{id=2131362125, res-name=item_image
|
+------>RelativeLayout{id=2131362124, res-name=item_image_thumb_layout
|
+------------->ImageView{id=2131362125, res-name=item_image
|
GridView{id=2131362110, res-name=item_list_grid, ...etc

Я хочу выполнить щелчок по одному из изображений ImageView с id=item_image.

Я не могу использовать что-то вроде atPosition(x) вместе с onView, поэтому вместо этого я использовал onData. Я пробовал все это:

onData(allOf(anything(),withId(R.id.item_image))).atPosition(0).perform(click());

onData(anything()).atPosition(0).perform(click());

onData(allOf(atPosition(0),withId(R.id.item_image))).perform(click());

Но все привело к

android.support.test.espresso.AmbiguousViewMatcherException: 'is assignable from class: class android.widget.AdapterView' matches multiple views in the hierarchy.

Любые предложения для этого? Спасибо!


person Great Question    schedule 21.01.2015    source источник


Ответы (1)


Ваше сообщение об ошибке говорит о том, что у вас есть несколько представлений в вашей деятельности, которые расширяют форму AdapterView, поэтому в вашем макете есть еще ListView или GridView.

Вы можете выбрать AdapterView на уровне данных. Итак, выберите этот AdapterView с элементами типа ItemModel

onData(is(instanceOf(ItemModel.class))).atPosition(0)
    .onChildView(withId(R.id.item_image)).perform(click());

или вы можете выбрать конкретный AdapterView по id

onData(anything()).inAdapterView(withId(R.id.my_grid_view)).atPosition(0).
            onChildView(withId(R.id.item_image)).perform(click());
person David Boho    schedule 21.01.2015
comment
Да, это правда. У меня есть 2 сетки (я отредактировал свои вопросы). Дело в том, что оба моих gridview имеют одинаковый идентификатор. Поэтому я не могу использовать ваше второе решение. Мое временное решение: onData(instanceOf(Item.class)).atPosition(0).inAdapterView(allOf(withId(R.id.item_list_grid), isDisplayed())).perform(click()); Я снова протестирую ваше первое решение, чтобы увидеть, работает ли оно. - person Great Question; 21.01.2015
comment
Если ваши сетки имеют одинаковые идентификаторы, вы делаете это неправильно. - person JaydeepW; 11.03.2015
comment
этого: onData(anything()).inAdapterView(withId(R.id.my_grid_view)).atPosition(0).perform(click()); мне хватило. Спасибо :) - person MHSFisher; 11.11.2019