Reputation: 39539
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
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
Reputation: 1
onView(withContentDescription("Open navigation drawer")).perform(click())
this helped me
Upvotes: 0
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
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
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
Reputation: 1092
Add onbackpress
in your activity, and use:
onView(withContentDescription("Navigate up")).perform(click());
Upvotes: -3
Reputation: 418
Espresso.pressBack();
Or
onView(withContentDescription("Navigate up")).perform(click());
Upvotes: 5
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
Reputation: 12455
I found a real solution to this issue. By using the hierarchyviewer I found that the toolbar looks like this:
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
Reputation: 199
I was having problems with "Navigate up" in an emulator, this worked for me:
onView(isRoot()).perform(ViewActions.pressMenuKey());
Upvotes: 5
Reputation:
I had trouble navigating back from one Activity to another, but then I found top-level actions:
Espresso.pressBack();
Upvotes: 21
Reputation: 5926
Use the withContentDescription()
Matcher
:
onView(withContentDescription("Navigate up")).perform(click());
Upvotes: 33