web-dev-qa-db-fra.com

Cliquez sur l'icône d'accueil avec Espresso

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?

35
ligi

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. 

60
sunlover3

Utilisez withContentDescription()Matcher:

onView(withContentDescription("Navigate up")).perform(click());
23
Matt Logan

J'ai eu du mal à revenir d'une activité à une autre, mais j'ai trouvé des actions de niveau supérieur:

Espresso.pressBack();
17
Igor Filippov

J'ai trouvé une vraie solution à ce problème. En utilisant le hierarchyviewer, j'ai trouvé que la barre d'outils ressemblait à ceci:  hierarchyviewer screenshot

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;
13
mreichelt

J'avais des problèmes avec "Navigate up" dans un émulateur, cela a fonctionné pour moi:

onView(isRoot()).perform(ViewActions.pressMenuKey());
5
Ekelbatzen
Espresso.pressBack();

Ou 

onView(withContentDescription("Navigate up")).perform(click());
4
Dong Thang
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!

2
user2210676

Pour revenir en arrière Voir:

onView(isRoot()).perform(pressBack());
2
testsingh
//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.");
    }
}
0
AppiDevo

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());
0