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());