Expresso cliquez sur l'élément du menu

j'ai un menu dans l'actionbar que je crée par:

@Override
public boolean onCreateOptionsMenu(Menu menu) {

    menu.add(Menu.NONE, 98,Menu.NONE,R.string.filter).setIcon(R.drawable.ic_filter_list_white_48dp).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
    menu.add(Menu.NONE, 99,Menu.NONE,R.string.add).setIcon(R.drawable.ic_add_white_48dp).setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);


    getMenuInflater().inflate(R.menu.menu_main, menu);

    return true;
}

et menu_main.xml ressemble à:

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity">
    <item
        android:id="@+id/action_settings"
        android:title="@string/action_settings"
        android:orderInCategory="100"
        app:showAsAction="never"
        android:icon="@drawable/ic_settings_white_48dp"/>
</menu>

lors d'un test en Espresso, j'aimerais cliquer sur l'icône "Ajouter" (menuId 99). J'ai essayé

@Test
public void testAdd() {
openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());
    onView(withText(R.string.add)).perform(click());
}

mais cela échoue avec une exception NoMatchingViewException. ( L'élément paramètres, qui est défini dans le xml directement je peux cliquer avec le même code. )

C'est pour targetSdkVersion 23 et AppCompatActivity. Les lignes pour la barre d'outils sont les suivants:

Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
setSupportActionBar(toolbar);
if( getSupportActionBar() != null ) {
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}

et tool_bar.xml ressemble à:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.Toolbar     xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark"
    android:background="@color/ColorPrimary"
    android:elevation="4dp"
    tools:ignore="UnusedAttribute">
</android.support.v7.widget.Toolbar>
17
demandé sur albodelu 2015-11-28 01:54:27

7 réponses

mise à Jour: Je n'ai pas vu la finale de la ligne, ignorer mes réponses précédentes, j'ai essayé de la corriger rapidement et j'ai fait une erreur. Je ne savais vraiment pas la réponse.

...setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)

votre question est expliquée ici par l'Espresso équipe:

corresponding visible icons:

  // Click on the icon - we can find it by the r.Id.
  onView(withId(R.id.action_save))
    .perform(click());

cliquer sur les éléments dans le menu overflow est un peu plus délicat pour le barre d'action normale car certains périphériques ont un débordement matériel bouton de menu (ils ouvriront les articles débordants dans un menu options) et certains les appareils ont un bouton de menu de débordement de logiciel (ils ouvriront une menu de débordement). Heureusement, Espresso gère ça pour nous.

  // Open the overflow menu OR open the options menu,
  // depending on if the device has a hardware or software overflow menu button.
  openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext());

  // Click the item.
  onView(withText("World"))
    .perform(click());

donc je comprends que les deux alternatives sont correctes mais dépendent de votre cas spécifique. Si vous testez un bouton, vous savez normalement s'il est visible ou non à ce moment-là.

dans votre cas, le bouton est visible parce qu'il y a de la place, et c'est correct d'utiliser withIdici:

import static android.support.test.espresso.Espresso.openActionBarOverflowOrOptionsMenu;

@Test
public void testClickInsertItem() {
    openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());
    onView(withId(R.id.action_insert)).perform(click());
}

Mais c'est correct aussi pour le débordement éléments:

Oui, c'est la façon dont il fonctionne dans l'Espresso. Le problème ici est que, dans Android, la vue représentant l'élément du menu n'a pas l'ID de l'élément de menu. Donc onView(withId (X)) ne parvient pas à trouver une vue. Je n'ai pas avoir une meilleure recommandation que de simplement en utilisant withText(). Si vous avez vues multiples avec le même texte, en utilisant hiérarchie pour la distinction travail.

maintenant, ma question Est ce qu'il faut faire quand vous testez sur différents appareils et vous ne savez pas quand sera la place pour un article. Je ne connais pas la réponse, peut-être combiner les deux solutions.

30
répondu albodelu 2017-05-23 12:10:07

vous pouvez utiliser cette méthode pour cliquer sur l'élément du menu. Cliquez d'abord sur le bouton menu en utilisant ce code

openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext());

puis effectuer le clic élément de menu basé sur le texte.Remplacer le nom de l'élément de votre menu par "MenuItemName"

onView(withText("MenuItemName")).perform(click());
3
répondu Ishan Fernando 2016-04-15 21:13:58
Espresso.openContextualActionModeOverflowMenu() 

était la seule option qui fonctionnait pour ma note de Samsung 3. Ce openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext()); essaierait et échouerait sans aucune erreur

1
répondu gorbysbm 2016-09-22 15:13:30

utilisez ceci pour correspondre au texte de description de l'élément de menu:

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

alors vous n'avez pas besoin de faire la correspondance sur L'ID (inexistant), ni sur l'icône dessinable.

n'oubliez pas D'utiliser ce code extrait de l'Espresso documentation si vous avez besoin de vérifier que le menu est élargi:

// Open the overflow menu OR open the options menu,
// depending on if the device has a hardware or software overflow menu button.
openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext());
1
répondu Eirik W 2016-12-20 08:41:04

La barre d'outils n'est pas l'actionBar, pas besoin de l'appel :

openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());

et si vous le faites, c'est sûr que votre article ne sera pas trouvé là (il n'est pas dans la barre D'action) et la barre d'outils appartient à la "vue normale".

0
répondu Mathias Seguy Android2ee 2016-04-13 12:39:33

C'est ma solution qui couvre toutes les trois situations: bouton Menu matériel, menu overflow, seulement les icônes:

    try {
        openActionBarOverflowOrOptionsMenu(InstrumentationRegistry.getTargetContext());
    } catch (Exception e) {
        //This is normal. Maybe we dont have overflow menu.
    }
    onView(anyOf(withText(R.string.<your label for the menu item>), withId(R.id.<id of the menu item>))).perform(click());
0
répondu guni 2016-10-16 17:25:22

ne souffre pas beaucoup. Let's simple.

onView(withId(98)).perform(click());

Cela vous aidera à effectuer, cliquez sur Ajouter

0
répondu Manish 2018-03-06 10:47:15