J'essaye d'écrire quelques tests avec le nouveau kit de test android (Espresso) . Mais je ne trouve aucune information sur la façon de vérifier si une boîte de dialogue est affichée et d'effectuer certaines actions dessus (comme cliquer sur les boutons positifs et négatifs, etc.). Notez qu'une boîte de dialogue peut également être affichée par a 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:
- Vérifiez si une boîte de dialogue apparaît
- Effectuer des clics sur les boutons de la boîte de dialogue
- Interagir avec la vue intérieure de la boîte de dialogue (s'il s'agit d'une vue personnalisée)
- Préformez les clics en dehors de la boîte de dialogue et vérifiez si elle s'affiche ou non (par exemple, si elle a
setCancelable(false)
été appelée sur le générateur de boîte de dialogue et que nous voulons vérifier cela)
Merci pour les conseils!
android
android-espresso
Serj Lotutovici
la source
la source
Réponses:
Pour vérifier si la boîte de dialogue apparaît, vous pouvez simplement vérifier si la vue avec un texte présent à l'intérieur de la boîte de dialogue est affichée:
onView(withText("dialogText")).check(matches(isDisplayed()));
ou, basé sur un texte avec identifiant
onView(withId(R.id.myDialogTextId)).check(matches(allOf(withText(myDialogText), isDisplayed()));
Pour cliquer sur le bouton des boîtes de dialogue, procédez comme suit (button1 - OK, button2 - Cancel):
onView(withId(android.R.id.button1)).perform(click());
MISE À JOUR
la source
J'utilise actuellement ceci et cela semble fonctionner correctement.
onView(withText(R.string.my_title)) .inRoot(isDialog()) // <--- .check(matches(isDisplayed()));
la source
Si vous avez un AlertDialog comme ça:
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 effectuez une action:
onView(withId(android.R.id.button3)).perform(click());
la source
android.R.id.message
et le titre avait un identifiant caché deandroid.R.id.alertTitle
.int alertDialogTitleId = android.support.v7.appcompat.R.id.alertTitle;
Pour répondre à la question 4, que la réponse acceptée ne fait pas, j'ai modifié le code suivant, que j'ai trouvé ici sur Stack Overflow ( lien ) pour tester 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
passé est l'id d'unView
actuellement affiché dans votre boîte de dialogue. Vous pouvez également é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 recherche un
View
contenant une chaîne de texte particulière.Utilisez-le comme ceci:
getRootView(getActivity(), R.id.text_id).perform(click());
la source
Les identifiants de bouton R.id.button1 et R.id.button2 ne seront pas identiques sur tous les appareils. Les identifiants peuvent changer avec les versions du système d'exploitation.
La bonne façon d'y parvenir est d'utiliser UIAutomator. Incluez 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(); }
la source
android.R.id.button1
,android.R.id.button2
etandroid.R.id.button3
pour « positive », « neutre » et « négatif », sont des symboles globaux qui peuvent être utilisés. Si vous choisissez de sélectionner des boutons via leur texte - ce qui est tout à fait correct - vous n'avez pas besoin d'UIAutomator, mais vous pouvez faire de même avec EspressoonView(withText("ButtonTest")).perform(click())
.Juste au cas où quelqu'un trébucherait sur cette question comme moi. Toutes les réponses ne fonctionneront que pour les boîtes de dialogue AVEC des boutons de dialogue. N'essayez pas de l'utiliser pour les boîtes de dialogue de progression sans intervention de l'utilisateur. Espresso attend que l'application entre en mode veille. Tant que la boîte de dialogue de progression est visible, l'application n'est pas inactive.
la source