J'essaie de cliquer sur l'icône de la maison dans certains tests Espresso via:
onView(withId(Android.R.id.home)).perform(click());
Cela fonctionne bien pour Android> 3.0 - mais échoue pour les anciennes versions car appcompat
ne semble pas utiliser cet identifiant pour cet élément. Quelle est la bonne approche pour faire ce que je veux faire?
Pour ne pas dépendre des paramètres régionaux de l'application, vous pouvez utiliser le code de Matt Logan en remplaçant "Navigate up" par R.string.abc_action_bar_up_description:
onView(withContentDescription(R.string.abc_action_bar_up_description)).perform(click());
Cela m'a beaucoup aidé car j'ai une application dans plus de 5 langues et je devais agir de la sorte.
Utilisez withContentDescription()
Matcher
:
onView(withContentDescription("Navigate up")).perform(click());
J'ai eu du mal à revenir d'une activité à une autre, mais j'ai trouvé des actions de niveau supérieur:
Espresso.pressBack();
J'ai trouvé une vraie solution à ce problème. En utilisant le hierarchyviewer, j'ai trouvé que la barre d'outils ressemblait à ceci:
Cela signifie que nous pourrions faire correspondre l'icône de hamburger (pas le bouton de retour) comme ceci:
onView(withContentDescription("Open navigation")).perform(click());
Mais une meilleure solution pour moi était de découvrir que l'icône hamburger était le seul ImageButton et une vue enfant directe de la barre d'outils v7. J'ai donc écrit une méthode d'assistance pour l'associer:
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());
// ...
}
Cette solution est préférable car elle doit correspondre à la vue, quelle que soit la langue utilisée dans votre test. :-)
EDIT: Notez que la barre d'outils peut être Android.support.v7.widget.Toolbar ou Android.widget.Toolbar - selon votre cas d'utilisation!
EDIT: La version de support technique 24.2.0 utilise AppCompatImageButton à la place de ImageButton, je l'ai donc ajoutée également.
EDIT: Vous devez importer les méthodes correctes pour que cela fonctionne. Voici les importations utilisées:
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;
J'avais des problèmes avec "Navigate up" dans un émulateur, cela a fonctionné pour moi:
onView(isRoot()).perform(ViewActions.pressMenuKey());
Espresso.pressBack();
Ou
onView(withContentDescription("Navigate up")).perform(click());
public static Matcher<View> navigationIconMatcher() {
return allOf(
isAssignableFrom(ImageButton.class),
withParent(isAssignableFrom(Toolbar.class)));
}
@Test
public void clickHamburgerIcon() throws Exception {
onView(navigationIconMatcher()).perform(click());
// ...
}
ça marche toujours!
Pour revenir en arrière Voir:
onView(isRoot()).perform(pressBack());
//click on the navigation up button to go back to the list
onView(withContentDescription(getToolbarNavigationContentDescription())).perform(click());
Les méthodes:
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.");
}
}
Si votre intention est d'ouvrir/fermer le tiroir, je vous recommande d'utiliser la bibliothèque de contributions Espresso:
onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());