J'essaie de mettre à jour un EditText
dans le cadre d'un test Espresso avec:
onView(allOf(withClassName(endsWith("EditText")), withText(is("Test")))).perform(clearText())
.perform(click())
.perform(typeText("Another test"));
Cependant, je reçois l'erreur suivante:
com.google.Android.apps.common.testing.ui.espresso.NoMatchingViewException: No views in hierarchy found matching: (with class name: a string ending with "EditText" and with text: is "Test")
En décomposant la ligne de test, je peux voir que cela se produit après avoir exécuté clearText()
, donc je suppose que les matchers sont réexécutés avant chaque perform
et échouent avant la deuxième action . Bien que cela ait du sens, cela me laisse un peu confus quant à la façon de mettre à jour le EditText
en utilisant Espresso. Comment dois-je procéder?
Notez que je ne peux pas utiliser un ID de ressource ou similaire dans ce scénario et que je dois utiliser la combinaison comme indiqué ci-dessus pour identifier la vue correcte.
Vous pouvez utiliser la méthode replaceText
.
onView(allOf(withClassName(endsWith("EditText")), withText(is("Test"))))
.perform(replaceText("Another test"));
Trois choses à essayer:
1. Vous pouvez exécuter des exécutions successivement.
onView(...)
.perform(clearText(), typeText("Some Text"));
2. Il y a un problème enregistré sur la page Espresso qui a été marqué comme invalide (mais qui est toujours un bug) . Une solution de contournement consiste à suspendre le test entre les exécutions.
public void test01(){
onView(...).perform(clearText(), typeText("Some Text"));
pauseTestFor(500);
onView(...).perform(clearText(), typeText("Some Text"));
}
private void pauseTestFor(long milliseconds) {
try {
Thread.sleep(milliseconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
3. Êtes-vous absolument sûr que votre EditText contient le texte "Test"?
J'avais un problème similaire et je l'ai résolu en utilisant le matcher containsString et Class.getSimpleName (). Comme ça:
onView(withClassName(containsString(PDFViewPagerIVZoom.class.getSimpleName()))).check(matches(isDisplayed()));
Vous pouvez voir le code complet ici
Vous pourriez essayer deux choses. J'essaierais d'abord d'utiliser
onView(withId(<id>).perform...
De cette façon, vous auriez toujours accès au champ EditText même lorsque d'autres champs EditText sont à l'écran.
Si ce n'est pas une option, vous pouvez diviser vos appels.
onView(allOf(withClassName(endsWith("EditText")),withText(is("Test")))).perform(clearText());
onView(withClassName(endsWith("EditText"))).perform(click());
onView(withClassName(endsWith("EditText"))).perform(typeText("Another Test");