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?

33
demandé sur Peter Hall 2014-06-02 02:30:22

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.

53
répondu sunlover3 2017-05-23 12:18:27

withContentDescription()Matcher:

onView(withContentDescription("Navigate up")).perform(click());
23
répondu Matt Logan 2014-11-12 23:07:23

j'ai eu de la difficulté à naviguer d'une activité à l'autre, mais j'ai trouvé des actions de haut niveau:

Espresso.pressBack();
17
répondu Igor Filippov 2015-02-12 09:37:18

j'ai trouvé une vraie solution à ce problème. En utilisant la hiérarchyviewer j'ai trouvé que la barre d'outils ressemble à ceci: hierarchyviewer screenshot

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;
11
répondu mreichelt 2016-09-05 14:47:20

j'ai eu des problèmes avec "Naviguer" dans un émulateur, cela a fonctionné pour moi:

onView(isRoot()).perform(ViewActions.pressMenuKey());
5
répondu Ekelbatzen 2016-06-08 14:52:32
Espresso.pressBack();

Ou

onView(withContentDescription("Navigate up")).perform(click());
4
répondu Dong Thang 2017-06-29 19:55:24
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!

2
répondu user2210676 2017-02-21 13:14:02

appuyez sur la touche back de la Vue:

onView(isRoot()).perform(pressBack());
2
répondu testsingh 2017-06-29 19:55:05

Peut-être que vous pouvez appeler:

pressKey(KeyEvent.KEYCODE_HOME);
-1
répondu owant zhong 2017-06-29 19:57:47

Ajouter onbackpress dans votre activité, et de l'utiliser:

onView(withContentDescription("Navigate up")).perform(click());
-2
répondu Dhiraj Himani 2017-06-29 19:57:02