2016-08-16 3 views
6

Ich habe einen Test, der ein Dialogfeld android.support.v7.preference.ListPreference öffnen muss, wählen Sie eine Option, öffnen Sie den NavDrawer und wählen Sie ein Element aus der Schublade.Android Espresso wartet nicht auf die Benutzeroberfläche

wird der Dialog wie folgt definiert:

<android.support.v7.preference.ListPreference 
    android:defaultValue="@string/pref_default_VALUE" 
    android:entries="@array/pref_VALUE_entries" 
    android:entryValues="@array/pref_VALUE_values" 
    android:key="@string/pref_key_VALUE" 
    android:negativeButtonText="@null" 
    android:positiveButtonText="@null" 
    android:title="@string/pref_title_VALUE" /> 

Espresso es wie folgt geöffnet:

onView(withText(mActivityRule.getActivity().getResources().getString(R.string.pref_title_VALUE)) 
    .perform(click()); 

Das die ListPreference öffnet, aber es nicht blockiert und die nächste Zeile im Test läuft sofort.

// click on setting 
    onView(withText(VALUE_IN_LIST_PREFERENCE)) 
      .perform(click()); 

Da dies sofort geschieht, hat der Dialog nicht erschienen und withText (VALUE_IN_LIST_PREFERENCE) passt nichts.

Wenn ich mit einem Debugger durch, in der obigen Zeile pausieren, erscheint der Dialog rechtzeitig und der Code wird funktionieren.

Das gleiche Problem passiert dann mit der Nav-Schublade. Es ist wie folgt geöffnet:

// open the nav drawer 
    onView(withId(R.id.drawer_layout)) 
      .perform(DrawerActions.open()); 

Und ein Artikel angeklickt:

// click on phase 1 
    onView(withId(R.id.nav_view)) 
      .perform(NavigationViewActions.navigateTo(R.id.nav_ITEM)); 

Wie bei dem ListPreferences, wird der Test fortgesetzt Code ohne warten, für die Benutzeroberfläche zu beenden und so der Anruf an OnView ausfällt.

ich versucht habe, setze den Thread zu schlafen und im Anschluss an die Antwort hier https://stackoverflow.com/a/22563297/4950621

In beiden Fällen sind jedoch der Dialog nicht erscheint, bis das Thema Schlafen fertig ist und die Ansicht Testläufe sofort. Also, das Problem ist nur verzögert, nicht gelöst.

Wie stelle ich sicher, dass die Espresso-Tests nicht ausgeführt werden, bis die erforderlichen Ansichten sichtbar sind?

Antwort

0

Wenn Sie noch keine Lösung gefunden haben, kann die hier angebotene Abhilfe hilfreich sein.

Wait until view become visible with IdleResource

Die Lösung ist IdlingResource zu implementieren, die Sie einen Rückruf zur Verfügung zu stellen können, sobald alles im Leerlauf nicht werden ausgeführt werden soll.

@Override 
public final boolean isIdleNow() { 
    mIdle = mIdle || mView.getVisibility() == mExpectedVisibility; 

    if (mIdle) { 
     if (mResourceCallback != null) { 
      mResourceCallback.onTransitionToIdle(); 
     } 
    } 

    return mIdle; 
} 
Verwandte Themen