Как получить доступ к элементу по имени класса в родительском элементе с помощью R.id - PullRequest
0 голосов
/ 28 июня 2019

Я пишу автоматизированный тест для входа в приложение Android.Я записываю тесты с помощью Record Espresso Test, а затем редактирую код, поскольку он обычно полон ошибок.Я использую эспрессо androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2', и uiAutomatorViewer для двойной проверки имен R.id's~ и class.

Я столкнулся с проблемой при попытке отредактировать текст в элементе без R.id но с именем класса android.widget.EditText:

android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: (with id: com.mydosesmart:id/til_name and an instance of android.widget.FrameLayout and an instance of android.widget.EditText)

Проблема в том, что элемент с именем класса android.widget.EditText не имеет R.id..Это имя класса не является уникальным для этого представления, этот элемент с именем класса android.widget.EditText имеет родительский элемент с уникальным R.id..

В представлении входа в приложение два элемента имеют имя класса android.widget.EditText, поэтому я не могу назвать этот элемент только по имени класса.Я хочу назвать это так: внутри элемента с R.id.til_name найдите элемент с именем класса android.widget.EditText.Ниже приведен код, который я использую сейчас, и он не работает.

ViewInteraction textInputEditText2 = onView(
                allOf(withId(R.id.til_name), instanceOf(Class.forName("android.widget.FrameLayout")), instanceOf(Class.forName("android.widget.EditText"))));
        textInputEditText2.perform(replaceText("testespresso"), closeSoftKeyboard());

Это тоже не удается:

ViewInteraction textInputEditText2 = onView(
                allOf(withId(R.id.til_name), instanceOf(Class.forName("android.widget.EditText"))));
        textInputEditText2.perform(replaceText("testespresso"), closeSoftKeyboard());

Поскольку у множества элементов в тестируемом приложении нет обозначенного R.id Я хотел бы найти простой способ вызвать их в целях тестирования.

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Попробовав десятки разных совпадений во всех возможных комбинациях, я нашел ответ на свой вопрос. Пока что это кажется универсальным: onView(allOf(withClassName(containsString(EditText.class.getSimpleName())), isDescendantOfA(withId(R.id.til_name)))) .perform(replaceText("testespresso "), closeSoftKeyboard());

Используя isDescendantOfA, нам не нужно беспокоиться, если искомый элемент имеет родителя / дедушку с R.id, он просто должен быть ниже в иерархии.

1 голос
/ 01 июля 2019

Я думаю, вам следует попробовать это (чтобы найти ваш EditText без идентификатора, но с родителем с уникальным известным идентификатором):

allOf(withParent(withId(R.id...)), withClassName(containsString(EditText.class.getName())))

Обновление на основе новой информации: для сопоставления с косвенным родителем (R.id.... где разместить косвенный идентификатор родителя):

allOf(isDescendantOfA(withId(R.id...)), withClassName(containsString(EditText.class.getName())))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...