2014-12-17 2 views
9

Ich habe die Home-Taste aktiviert, um zur vorherigen Ansicht zurückzukehren. Einfach gesagt, dies zu tun:Wie teste ich die Home-Taste in der Aktionsleiste mit Espresso?

getActionBar().setDisplayHomeAsUpEnabled(true);

ich die letzte Version von com.android.support:appcompat-v7:21.0.2 bin mit. Wenn ich jedoch den folgenden Code verwende, funktioniert das nicht, wenn eine Exception geworfen wird.

Espresso.onView(ViewMatchers.withId(android.R.id.home)).perform(ViewActions.click()); Espresso.onView(ViewMatchers.withId(R.id.home)).perform(ViewActions.click());

Ausnahme:

com.google.android.apps.common.testing.ui.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: is <2131296261> ...

+0

Hmm, interessant. Ich verwende den gleichen Code, um eine Aktion auf der Home-Taste auszuführen: onView (withId (android.R.id.home)).führen (klicken (()); Leider verwenden wir immer noch appcompat-v7: 20.0. +. Vielleicht hat das etwas mit der neuen Android Toolbar zu tun? Welche ID erhalten Sie, wenn Sie die Ansicht mit Android Monitor überprüfen? – Christopher

+0

Offenbar gibt es keine ID mit der neuen Android Toolbar, anstatt dass wir "Navigate up" verwenden :(. –

Antwort

4

Ich habe die folgende Abhilfe:

private String getString(int resId){ 
    return getInstrumentation().getTargetContext().getString(resId); 
} 

public void testUI() { 
    onView(withContentDescription(getString(R.string.navigation_drawer_open))).perform(click()); 
    onView(withContentDescription(getString(R.string.navigation_drawer_close))).perform(click()); 
} 

Grundsätzlich verwende ich die Beschreibung Inhalt Attribut anstelle der Ansicht ID.

0

Ich selbst beantworten. Laut der Post auf click home icon with espresso, ist es nicht möglich, eine Id für die Home-Schaltfläche in ActionBar, mindestens die mit Version 7 der Support-Bibliothek anzugeben, so dass wir "Navigieren nach oben" verwenden sollten. Aber warum?

Dies ist der Grund, dank des Espresso-Fehlertrace:

--------> ActionMenuView 
      { 
      id=-1, visibility=VISIBLE, width=144, height=168, has-focus=false, 
      has-focusable=true, has-window-focus=true, is-clickable=false, 
      is-enabled=true, is-focused=false, is-focusable=false, 
      is-layout-requested=false, is-selected=false, root-is-layout-requested=false, 
      has-input-connection=false, x=936.0, y=0.0, child-count=1 
      } 
| 
--------> ActionMenuItemView 
      { 
      id=2131296554, res-name=general, desc=, visibility=VISIBLE, 
      width=144, height=144, has-focus=false, has-focusable=true, 
      has-window-focus=true, is-clickable=true, is-enabled=true, 
      is-focused=false, is-focusable=true, is-layout-requested=false, 
      is-selected=false, root-is-layout-requested=false, 
      has-input-connection=false, x=0.0, y=12.0, text=, input-type=0, ime-target=false 
      } 
| 
--------> ImageButton 
      { 
      id=-1, desc=Navigate up, visibility=VISIBLE, width=168, height=168, 
      has-focus=false, has-focusable=true, has-window-focus=true, is-clickable=true, 
      is-enabled=true, is-focused=false, is-focusable=true, is-layout-requested=false, 
      is-selected=false, root-is-layout-requested=false, has-input-connection=false, x=0.0, y=0.0 
      } 
| 
-1

Ich wusste nicht, es war so ein großer Unterschied AppCompat die Aktionsleiste verwenden. Wie ihr in den Kommentaren geschrieben habt, funktioniert die "Ebene hoch" wirklich. Für diejenigen, die, wie ich, rechnen konnte nicht, wie es zu tun Espresso mit, hier ist die Art und Weise:

import static android.support.test.espresso.Espresso.onView; 
import static android.support.test.espresso.action.ViewActions.click; 
import static android.support.test.espresso.matcher.ViewMatchers.withContentDescription; 

onView(withContentDescription("Navigate up")).perform(click());

unerwün- schte für AppCompat v7

In meinem Projekt ich bin mit Robotium und Espresso zusammen. Für den Home-Button klicke ich auf Robotiums Solo#clickOnActionBarHomeButton. Es ist mehr als 1 Zeile wie in click home icon with espresso , aber Sie müssen nicht den Titel angeben. (Es kann in einigen speziellen Fällen nützlich sein ...). Anyways entscheide ich, welche man nach verwenden, um SDK Version:

public static void actionBarBack(Instrumentation instrumentation, final Solo solo, String actionBarText) { 
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT) { 
     onView(allOf(withText(actionBarText), isDisplayed())).perform(click()); 
    } 
    else { 
     instrumentation.runOnMainSync(new Runnable() { 
      @Override 
      public void run() { 
       solo.clickOnActionBarHomeButton(); 
      } 
     }); 
    } 
} 

Hier ist die Nutzung ist:

Compatibility.actionBarBack(getInstrumentation(), solo, R.string.any); 

Es hat in runOnMainSync gewickelt werden, weil Robotium Test-Framework ein bisschen fauler ist, und wenn Sie habe behauptet, z für Action-Bar-Titel, direkt nach der Aussage wird es immer noch nicht zurück sein. Kann aber nur mit solo.clickOnActionBarHomeButton(); versuchen. Es könnte wahrscheinlich für dich arbeiten.

14

Es ist möglich, auf die Schaltfläche zu klicken, wenn Sie die Beschreibung aus den Ressourcen verwenden.

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

funktioniert mit AppCompat-v7: 23.1.1

+0

Denken Sie daran, dass 'R.string.abc_action_bar_up_description' privat ist und jederzeit geändert werden kann. Aber vorläufig, Das war die beste Option, die ich finden konnte. –

Verwandte Themen