Espresso выберите детей с включенным макетом

Я использую Espresso для проведения автоматического тестирования пользовательского интерфейса с помощью приложения для Android. (Я пытаюсь найти решение проблемы, пока дома с работы, поэтому у меня нет точных примеров и ошибок, но я могу обновить завтра утром). Я столкнулся с проблемой с модульными модульными кнопками в макете, которые несколько раз включаются в один пользовательский интерфейс. Ниже приведен краткий пример:

<include 
   android:id="@+id/include_one"
   android:layout="@layout/boxes" />

<include 
   android:id="@+id/include_two"
   android:layout="@layout/boxes" />

<include 
    android:id="@+id/include_three"
    android:layout="@layout/boxes" />

Вот пример того, что находится внутри полей @layout/boxes:

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <Button
        android:id="@+id/button1" />
    <Button
        android:id="@+id/button2" />
</RelativeLayout>

Кажется, я не могу получить доступ к кнопке один внутри include, я хочу "include_one", не обращаясь ко всем трем кнопкам.

Я попытался получить доступ к кнопкам со следующим:

onView(allOf(withId(R.id.include_one), isDescendantOfA(withId(R.id.button1)))).perform(click());

и

onView(allOf(withId(R.id.button1), hasParent(withId(R.id.include_one)))).perform(click());

Оба из которых я нашел из этого ответа: onChildView и hasSiblings с Espresso К сожалению, я не имел никакого успеха!

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

com.google.android.apps.common.testing.ui.espresso.AmbiguousViewMatcherException

также ошибка, сообщающая мне, что совпадений не найдено.

Код, который я использую, имеет смысл, хотя я новичок в использовании Espresso. Может ли кто-нибудь предложить какой-либо совет или указать, что я могу быть недопониманием?

Ответы

Ответ 1

Это обычная ошибка при попытке <include/> одного и того же пользовательского xml несколько раз в одном макете.

Если вы сейчас попробуете позвонить

Button button1 = (Button) findViewById(R.id.button1);

так как box.xml включен более одного раза, вы всегда получите в результате кнопку, присутствующую в первом вспомогательном макете, и никогда другой.

Вы были довольно близки, но вам нужно использовать withParent().

onView(allOf(withId(R.id.button1), withParent(withId(R.id.include_one))))
                .check(matches(isDisplayed()))
                .perform(click());