webentwicklung-frage-antwort-db.com.de

Klicken Sie mit Espresso auf das Startsymbol

Ich versuche in einigen Espresso-Tests auf das Home-Symbol zu klicken:

onView(withId(Android.R.id.home)).perform(click());

Dies funktioniert gut für Android> 3.0 - schlägt jedoch für ältere Versionen fehl, da appcompat diese ID für dieses Element nicht zu verwenden scheint. Was ist ein guter Ansatz, um das zu tun, was ich tun möchte?

35
ligi

Um nicht vom App-Gebietsschema abhängig zu sein, können Sie den Code aus Matt Logan verwenden, indem Sie "Navigate up" durch R.string.abc_action_bar_up_description ersetzen:

onView(withContentDescription(R.string.abc_action_bar_up_description)).perform(click());

Das hat mir sehr geholfen, weil ich eine App in mehr als 5 Sprachen habe und ich mich so verhalten musste. 

60
sunlover3

Verwenden Sie die withContentDescription()Matcher:

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

Ich hatte Probleme beim Navigieren von einer Aktivität zu einer anderen, fand dann jedoch Aktionen auf der obersten Ebene:

Espresso.pressBack();
17
Igor Filippov

Ich habe eine echte Lösung für dieses Problem gefunden. Mit dem hierarchyviewer habe ich festgestellt, dass die Symbolleiste folgendermaßen aussieht:  hierarchyviewer screenshot

Dies bedeutet, dass wir das Hamburger-Symbol (nicht die Schaltfläche "Zurück") wie folgt anpassen können:

onView(withContentDescription("Open navigation")).perform(click());

Eine bessere Lösung für mich war jedoch herauszufinden, dass das Hamburger-Symbol der einzige ImageButton und eine direkte untergeordnete Ansicht der v7-Toolbar ist. Also habe ich eine Hilfsmethode geschrieben, um sie anzupassen:

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());
    // ...
}

Diese Lösung ist besser, da sie der Ansicht entsprechen sollte, unabhängig davon, welches Gebietsschema Sie in Ihrem Test verwenden. :-)

BEARBEITEN: Beachten Sie, dass die Symbolleiste Android.support.v7.widget.Toolbar oder Android.widget.Toolbar sein kann - abhängig von Ihrem Anwendungsfall!

BEARBEITEN: Die Version 24.2.0 der Unterstützungslib verwendet AppCompatImageButton anstelle von ImageButton, daher habe ich sie auch hinzugefügt.

BEARBEITEN: Sie müssen die korrekten Methoden importieren, damit dies funktioniert. Hier sind die verwendeten Importe:

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

Ich hatte Probleme mit "Navigate up" in einem Emulator, das funktionierte für mich:

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

Oder 

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());
// ...
}

das funktioniert immer!

2
user2210676

Zurück blättern:

onView(isRoot()).perform(pressBack());
2
testsingh
//click on the navigation up button to go back to the list
onView(withContentDescription(getToolbarNavigationContentDescription())).perform(click());

Methoden:

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

Wenn Sie die Schublade öffnen/schließen möchten, empfehle ich die Verwendung der Espresso Contrib-Bibliothek:

onView(withId(R.id.drawer_layout)).perform(DrawerActions.open());