Исключение Espresso NoMatchingViewException при использовании withid matcher
Я пытаюсь написать простой тест, где я просто нажимаю на меню, которое находится в основной деятельности:
public class doTest extends ActivityInstrumentationTestCase2<doActivity> {
public doTest() {
super(doActivity.class);
}
@Override
public void setUp() throws Exception {
super.setUp();
startActivity();
}
private void startActivity() {
Intent intent = new Intent();
setActivityIntent(intent);
getActivity();
}
public void testOne() {
Espresso.openContextualActionModeOverflowMenu();
onView(withId(R.id.create_new)).perform(ViewActions.click());
}
}
тест завершается с ошибкой "NoMatchingViewException". Если я изменю строку onView на:
onView(withText("Add new")).perform(ViewActions.click());
вот меню xml для деятельности:
<item
android:id="@+id/create_new"
android:title="Add new"
tools:ignore="HardcodedText">
</item>
тест работает. Почему matcher withText находит представление, тогда как matcher withId не находит?
2 ответов
да, так это работает в эспрессо. Проблема здесь в том, что в Android представление, представляющее элемент меню, не имеет идентификатора элемента меню. Так что onView(withId(X))
просто не удается найти вид. У меня нет лучшей рекомендации, чем просто использовать withText()
. Если у вас несколько представлений с одним и тем же текстом, использование иерархии для различения работает.
ответ хаффакса правильный. Элемент меню и вид, созданный для меню, имеют разные идентификаторы. Используя withText
является наиболее известной практикой в этом случае.
чтобы избежать хардкодить текст 'добавить новый' в ваш тест, я бы recommmand используя строку ссылку. Е. Г.,
<item
android:id="@+id/create_new"
android:title="@string/action_create_new"
tools:ignore="HardcodedText"
/>