Cliquez sur l'icône accueil avec Espresso
j'essaie de cliquer sur l'icône d'accueil dans quelques tests Espresso via:
onView(withId(android.R.id.home)).perform(click());
cela fonctionne bien pour Android > 3.0 - mais échoue pour les versions plus anciennes comme appcompat
ne semble pas utiliser cet identifiant pour cet élément est alors. Ce qui est une bonne approche pour faire ce que je veux faire?
10 réponses
Pour ne pas dépendre de l'application locale, vous pouvez utiliser le code de Matt Logan en remplaçant "naviguer vers le haut" 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 j'ai dû agir de la sorte.
withContentDescription()
Matcher
:
onView(withContentDescription("Navigate up")).perform(click());
j'ai eu de la difficulté à naviguer d'une activité à l'autre, mais j'ai trouvé des actions de haut niveau:
Espresso.pressBack();
j'ai trouvé une vraie solution à ce problème. En utilisant la hiérarchyviewer j'ai trouvé que la barre d'outils ressemble à ceci:
cela signifie que nous pouvons faire correspondre l'icône hamburger (pas bouton Retour) comme ceci:
onView(withContentDescription("Open navigation")).perform(click());
mais une meilleure solution pour moi était de découvrir que l'icône hamburger est le seul bouton D'image et une vue directe enfant de la barre d'outils v7. J'ai donc écrit une méthode helper pour la faire correspondre:
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 meilleure parce qu'il devrait correspondre à la vue, peu importe quelle locale vous utilisez dans votre test. : -)
modifier: notez que Toolbar pourrait être android.soutien.v7.widget.Barre d'outils ou android.widget.Barre d'outils-selon votre cas d'utilisation!
EDIT: le support lib version 24.2.0 utilise AppCompatImageButton au lieu D'ImageButton, donc je l'ai ajouté, aussi.
EDIT: vous devez importer les méthodes correctes pour que cela fonctionne. Voici les importations utilisé:
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'ai eu des problèmes avec "Naviguer" 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());
// ...
}
cela fonctionne toujours!
appuyez sur la touche back de la Vue:
onView(isRoot()).perform(pressBack());
Peut-être que vous pouvez appeler:
pressKey(KeyEvent.KEYCODE_HOME);
Ajouter onbackpress
dans votre activité, et de l'utiliser:
onView(withContentDescription("Navigate up")).perform(click());