2017-09-19 3 views
0

Je suis un débutant dans Espresso. J'ai ce fichier menu.xml:Obtenez un produit d'un article dans l'espresso

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <item 
     android:id="@+id/configuration" 
     android:icon="@drawable/ic_settings" 
     android:title="Configuration" 
     app:showAsAction="ifRoom"> 

     <menu> 
      <item 
       android:id="@+id/add_sound" 
       android:title="Add a sound" 
       app:showAsAction="ifRoom" /> 

      <item 
       android:id="@+id/takeof_sound" 
       android:enabled="false" 
       android:title="Take of the sound" 
       app:showAsAction="ifRoom" /> 

      <item 
       android:id="@+id/add_image" 
       android:title="Add an image" 
       app:showAsAction="ifRoom" /> 

      <item 
       android:id="@+id/takeof_image" 
       android:enabled="false" 
       android:title="Take of the image" 
       app:showAsAction="ifRoom" /> 
     </menu> 

    </item> 

    <item 
     android:id="@+id/add" 
     android:icon="@drawable/ic_add" 
     android:title="Add" 
     app:showAsAction="ifRoom" /> 
</menu> 

Je voudrais effectuer un clic sur l'élément avec id configuration puis un clic sur le sous-élément avec id add_sound. Alors, je l'ai tapé ce code:

public void menuConfigurationTest() 
    { 
     onView(withId(R.id.configuration)).perform(click()); 
     onView(withId(R.id.add_sound)).perform(click()); 
    } 

Cependant, je reçois cette erreur:

android.support.test.espresso.NoMatchingViewException: No views in hierarchy found matching: with id: com.example.adrien.smartalarm:id/add_sound 
If the target view is not part of the view hierarchy, you may need to use Espresso.onData to load it from one of the following AdapterViews:android.support.v7.widget.MenuPopupWindow$MenuDropDownListView{5a0c4d8 VFED.VC.. .F...... 0,0-686,672} 

Qu'est-ce qui ne va pas avec ce que je l'ai fait?

Répondre

1

Le problème est que le sous-menu est affiché dans un PopupWindow, qui ne fait pas partie de la hiérarchie des vues de l'activité. Par conséquent, vous devez ajouter:

.inRoot(RootMatchers.isPlatformPopup()) 

La prochaine chose est les éléments sont affichés dans un ListView spécial nommé MenuDropDownListView. Donc onView() ne fonctionnera pas ici, vous devez utiliser onData().

Par conséquent, l'expression complète est la suivante:

onData(CoreMatchers.anything()) 
     .inRoot(RootMatchers.isPlatformPopup()) // isPlatformPopup() == is in PopupWindow 
     .inAdapterView(CoreMatchers.<View>instanceOf(MenuPopupWindow.MenuDropDownListView.class)) 
     .atPosition(0) // for the first submenu item, here: add_sound 
     .perform(click());