Подтвердить что ты не робот

Нажмите значок дома с эспрессо

Я пытаюсь щелкнуть значок дома в некоторых тестах эспрессо с помощью:

onView(withId(android.R.id.home)).perform(click());

Это отлично работает для Android > 3.0 - но не работает для более старых версий, поскольку appcompat, похоже, не использует этот идентификатор для этого элемента. Какой хороший подход делать то, что я хочу сделать?

4b9b3361

Ответ 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);