web-dev-qa-db-fra.com

Vérifier si une boîte de dialogue est affichée avec Espresso

J'essaie d'écrire des tests avec le nouveau Android-test-kit (Espresso) . Mais je ne trouve aucune information sur comment vérifier si une boîte de dialogue est affichée et effectuer certaines actions (comme cliquer sur les boutons positif et négatif, etc). Notez qu'un dialogue peut également être affiché par un WebView, pas par l'application elle-même.

Toute aide serait appréciée. J'ai juste besoin d'un lien, ou d'un exemple de code pour les bases:

  1. Vérifier si une boîte de dialogue apparaît
  2. Effectuer des clics sur les boutons de dialogue
  3. Interagir avec la vue interne de la boîte de dialogue (s'il s'agit d'une vue personnalisée)
  4. La préforme clique en dehors de la boîte de dialogue et vérifie si elle s'affiche ou non (par exemple, si setCancelable(false) a été appelée dans le générateur de boîte de dialogue et nous voulons vérifier cela).

Merci dans les conseils!

73
Serj Lotutovici
  1. Pour vérifier si la boîte de dialogue apparaît, vous pouvez simplement vérifier si Afficher avec un texte présent dans la boîte de dialogue est affiché:

    onView(withText("dialogText")).check(matches(isDisplayed()));
    

    ou, basé sur un texte avec id

    onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
    
  2. Pour cliquer sur le bouton dialogues, faites ceci (bouton1 - OK, bouton2 - Annuler):

    onView(withId(Android.R.id.button1)).perform(click());
    

    MISE À JOUR

  3. Je pense que c'est possible puisque Espresso a support multi-fenêtres .
  4. Vous n'êtes pas sûr de cliquer en dehors de la boîte de dialogue personnalisée, mais pour vérifier si elle s'affiche ou non, vous devez créer votre outil de correspondance personnalisé et vérifier à l'intérieur de celle-ci.
106
denys

J'utilise actuellement cela et cela semble bien fonctionner.

onView(withText(R.string.my_title))
    .inRoot(isDialog()) // <---
    .check(matches(isDisplayed()));
57
kiruwka

Si vous avez un AlertDialog comme celui-ci:

enter image description here

Vous pouvez vérifier si les composants sont affichés:

int titleId = mActivityTestRule.getActivity().getResources()
        .getIdentifier( "alertTitle", "id", "Android" );

onView(withId(titleId))
        .inRoot(isDialog())
        .check(matches(withText(R.string.my_title)))
        .check(matches(isDisplayed()));

onView(withId(Android.R.id.text1))
        .inRoot(isDialog())
        .check(matches(withText(R.string.my_message)))
        .check(matches(isDisplayed()));

onView(withId(Android.R.id.button2))
        .inRoot(isDialog())
        .check(matches(withText(Android.R.string.no)))
        .check(matches(isDisplayed()));

onView(withId(Android.R.id.button3))
        .inRoot(isDialog())
        .check(matches(withText(Android.R.string.yes)))
        .check(matches(isDisplayed()));

et effectuer une action:

onView(withId(Android.R.id.button3)).perform(click());
23
Luiz Augusto

Juste au cas où quelqu'un tomberait comme moi sur cette question. Toutes les réponses ne fonctionneront que pour les dialogues AVEC boutons de dialogue. N'essayez pas de l'utiliser pour les dialogues de progression sans interaction de l'utilisateur. Espresso continue d'attendre que l'application entre dans un état d'inactivité. Tant que la boîte de dialogue de progression est visible, l'application n'est pas inactive.

3
Diana Farin

Pour répondre à la question 4, ce que la réponse acceptée ne permet pas, j'ai modifié le code suivant, que j'ai trouvé ici sur Stack Overflow ( lien ) pour vérifier si un Toast était affiché.

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @IdRes int id) {
    return onView(withId(id)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

Le id transmis est l'identifiant d'un View actuellement affiché dans votre boîte de dialogue. Vous pouvez aussi écrire la méthode comme ceci:

@NonNull
public static ViewInteraction getRootView(@NonNull Activity activity, @NonNull String text) {
    return onView(withText(text)).inRoot(withDecorView(not(is(activity.getWindow().getDecorView()))));
}

Et maintenant, il cherche un View contenant une chaîne de texte particulière.

Utilisez-le comme suit:

getRootView(getActivity(), R.id.text_id).perform(click());
2
AutonomousApps

Les boutons Id. R.id.button1 et R.id.button2 ne seront pas identiques sur tous les périphériques. Les ID peuvent changer avec les versions du système d'exploitation.

La bonne façon d’y parvenir est d’utiliser UIAutomator. Inclure la dépendance UIAutomator dans votre build.gradle

// Set this dependency to build and run UI Automator tests
  androidTestCompile 'com.Android.support.test.uiautomator:uiautomator-v18:2.1.2'

et utilise

// Initialize UiDevice instance
UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

// Search for correct button in the dialog.
UiObject button = uiDevice.findObject(new UiSelector().text("ButtonText"));
if (button.exists() && button.isEnabled()) {
    button.click();
}
2
JaydeepW