ligi
ligi

Reputation: 39539

Click home icon with Espresso

I am trying to click the home icon in some Espresso tests via:

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

This works fine for Android > 3.0 - but fails for older versions as appcompat does not seem to use this id for this element then. What is a good approach to do what I want to do?

Upvotes: 48

Views: 27277

Answers (14)

AthaMit
AthaMit

Reputation: 340

Update: I couldnt find R.string.abc_action_bar_up_description, maybe it has to do with androidx. I'm not sure about this. Instead I used R.string.nav_app_bar_navigate_up_description The code looks like this:

onView(withContentDescription(R.string.nav_app_bar_navigate_up_description)).perform(click())

Upvotes: 2

user12375116
user12375116

Reputation: 1

onView(withContentDescription("Open navigation drawer")).perform(click())

this helped me

Upvotes: 0

sunlover3
sunlover3

Reputation: 2049

To not depend on the app locale, you can use the code from Matt Logan by replacing "Navigate up" with R.string.abc_action_bar_up_description:

onView(withContentDescription(R.string.abc_action_bar_up_description)).perform(click());

This helped me a lot because I have an app in more than 5 languages and I had to act like this.

Upvotes: 89

Miloš Černilovský
Miloš Černilovský

Reputation: 4112

If your intention is opening / closing the drawer, I recommend using the Espresso contrib library:

onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());

Upvotes: 3

AppiDevo
AppiDevo

Reputation: 3225

//click on the navigation up button to go back to the list
onView(withContentDescription(getToolbarNavigationContentDescription())).perform(click());

Methods:

private String getToolbarNavigationContentDescription() {
    return TestUtils.getToolbarNavigationContentDescription(
            activityTestRule.getActivity(), R.id.toolbar);
}

public static String getToolbarNavigationContentDescription(
        @NonNull Activity activity, @IdRes int toolbarId) {
    Toolbar toolbar = activity.findViewById(toolbarId);
    if (toolbar != null) {
        return (String) toolbar.getNavigationContentDescription();
    } else {
        throw new RuntimeException("No toolbar found.");
    }
}

Upvotes: 1

owant zhong
owant zhong

Reputation: 1

Maybe you can call:

pressKey(KeyEvent.KEYCODE_HOME);

Upvotes: -2

Dhiraj Himani
Dhiraj Himani

Reputation: 1092

Add onbackpress in your activity, and use:

onView(withContentDescription("Navigate up")).perform(click());

Upvotes: -3

Dong Thang
Dong Thang

Reputation: 418

Espresso.pressBack();

Or

onView(withContentDescription("Navigate up")).perform(click());

Upvotes: 5

Testing Singh
Testing Singh

Reputation: 1353

To press back View:

onView(isRoot()).perform(pressBack());

Upvotes: 2

user2210676
user2210676

Reputation: 51

public static Matcher<View> navigationIconMatcher() {
    return allOf(
            isAssignableFrom(ImageButton.class),
            withParent(isAssignableFrom(Toolbar.class)));
}

@Test
public void clickHamburgerIcon() throws Exception {
onView(navigationIconMatcher()).perform(click());
// ...
}

this works always!

Upvotes: 5

mreichelt
mreichelt

Reputation: 12455

I found a real solution to this issue. By using the hierarchyviewer I found that the toolbar looks like this: hierarchyviewer screenshot

This means we could match the hamburger icon (not back button) like this:

onView(withContentDescription("Open navigation")).perform(click());

But a better solution to me was to find out that the hamburger icon is the only ImageButton and a direct child view of the v7 Toolbar. So I wrote a helper method to match it:

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());
    // ...
}

This solution is better because it should match the view no matter which locale you use in your test. :-)

EDIT: Note that Toolbar might be android.support.v7.widget.Toolbar or android.widget.Toolbar - depending on your use case!

EDIT: The support lib version 24.2.0 uses AppCompatImageButton instead of ImageButton, so I added it, too.

EDIT: You have to import the correct methods to get this to work. Here are the imports used:

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;

Upvotes: 14

Robin S
Robin S

Reputation: 199

I was having problems with "Navigate up" in an emulator, this worked for me:

onView(isRoot()).perform(ViewActions.pressMenuKey());

Upvotes: 5

user468311
user468311

Reputation:

I had trouble navigating back from one Activity to another, but then I found top-level actions:

Espresso.pressBack();

Upvotes: 21

Matt Logan
Matt Logan

Reputation: 5926

Use the withContentDescription() Matcher:

onView(withContentDescription("Navigate up")).perform(click());

Upvotes: 33

Related Questions