web-dev-qa-db-fra.com

Mettre à jour un EditText avec Espresso

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.

28
jgm

Vous pouvez utiliser la méthode replaceText.

onView(allOf(withClassName(endsWith("EditText")), withText(is("Test"))))
    .perform(replaceText("Another test"));
36
Abhinav Manchanda

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"?

16
James Davis

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

2
voghDev

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");
1
Maxwell