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>
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 withId
ici:
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.
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());
Espresso.openContextualActionModeOverflowMenu()
était la seule option qui fonctionnait pour ma note de Samsung 3. Ce openActionBarOverflowOrOptionsMenu(getInstrumentation().getTargetContext());
essaierait et échouerait sans aucune erreur
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());
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".
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());
ne souffre pas beaucoup. Let's simple.
onView(withId(98)).perform(click());
Cela vous aidera à effectuer, cliquez sur Ajouter