Нажмите значок дома с эспрессо
Я пытаюсь щелкнуть значок дома в некоторых тестах эспрессо с помощью:
onView(withId(android.R.id.home)).perform(click());
Это отлично работает для Android > 3.0 - но не работает для более старых версий, поскольку appcompat
, похоже, не использует этот идентификатор для этого элемента. Какой хороший подход делать то, что я хочу сделать?
Ответы
Ответ 1
Чтобы не зависеть от локали приложения, вы можете использовать код из Matt Logan, заменив "Navigate up" на R.string.abc_action_bar_up_description:
onView(withContentDescription(R.string.abc_action_bar_up_description)).perform(click());
Это очень помогло мне, потому что у меня есть приложение на более чем 5 языках, и мне приходилось так поступать.
Ответ 2
Используйте withContentDescription()
Matcher
:
onView(withContentDescription("Navigate up")).perform(click());
Ответ 3
У меня возникли проблемы с переходом от одного действия к другому, но затем я нашел действия верхнего уровня:
Espresso.pressBack();
Ответ 4
Я нашел реальное решение этой проблемы. Используя иерархический просмотрщик, я обнаружил, что панель инструментов выглядит так:
![снимок экрана иерархического просмотра]()
Это означает, что мы можем сопоставить значок гамбургера (не обратно):
onView(withContentDescription("Open navigation")).perform(click());
Но лучшим решением для меня было выяснить, что значок гамбургера является единственным ImageButton и прямым детским представлением панели инструментов v7. Поэтому я написал вспомогательный метод для его соответствия:
public static Matcher<View> androidHomeMatcher() {
return allOf(
withParent(withClassName(is(Toolbar.class.getName()))),
withClassName(anyOf(
is(ImageButton.class.getName()),
is(AppCompatImageButton.class.getName())
)));
}
@Test
public void clickHamburgerIcon() throws Exception {
onView(androidHomeMatcher()).perform(click());
// ...
}
Это решение лучше, потому что оно должно соответствовать представлению независимо от того, какой язык вы используете в своем тесте.: -)
EDIT: обратите внимание, что на панели инструментов может быть android.support.v7.widget.Toolbar или android.widget.Toolbar - в зависимости от вашего использования!
EDIT: версия lib.2 версии 24.2.0 использует AppCompatImageButton вместо ImageButton, поэтому я добавил ее тоже.
EDIT: вам нужно импортировать правильные методы, чтобы заставить это работать. Вот используемые им импорт:
import static android.support.test.espresso.matcher.ViewMatchers.withClassName;
import static android.support.test.espresso.matcher.ViewMatchers.withParent;
import static org.hamcrest.Matchers.allOf;
import static org.hamcrest.Matchers.is;
Ответ 5
У меня возникли проблемы с "Навигация вверх" в эмуляторе, это сработало для меня:
onView(isRoot()).perform(ViewActions.pressMenuKey());
Ответ 6
Для возврата назад:
onView(isRoot()).perform(pressBack());
Ответ 7
Espresso.pressBack();
Или
onView(withContentDescription("Navigate up")).perform(click());
Ответ 8
public static Matcher<View> navigationIconMatcher() {
return allOf(
isAssignableFrom(ImageButton.class),
withParent(isAssignableFrom(Toolbar.class)));
}
@Test
public void clickHamburgerIcon() throws Exception {
onView(navigationIconMatcher()).perform(click());
// ...
}
это всегда работает!
Ответ 9
Добавьте onbackpress
в свою деятельность и используйте:
onView(withContentDescription("Navigate up")).perform(click());
Ответ 10
Возможно, вы можете позвонить:
pressKey(KeyEvent.KEYCODE_HOME);