Aktualisieren eines EditText mit Espresso

Lesezeit: 3 Minuten

Ich versuche, ein zu aktualisieren EditText im Rahmen eines Espresso-Tests mit:

onView(allOf(withClassName(endsWith("EditText")), withText(is("Test")))).perform(clearText())
                                                                        .perform(click())
                                                                        .perform(typeText("Another test"));

Allerdings erhalte ich folgenden Fehler:

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

Durch Aufschlüsseln der Testlinie kann ich sehen, dass dies nach der Durchführung auftritt clearText()also gehe ich davon aus, dass die Matcher vor jedem erneut ausgeführt werden perform und scheitern an der vor der zweiten Aktion. Obwohl dies sinnvoll ist, lässt es mich etwas verwirrt, wie man die aktualisiert EditText mit Espresso. Wie soll ich das machen?

Beachten Sie, dass ich in diesem Szenario keine Ressourcen-ID oder ähnliches verwenden kann und die Kombination wie oben gezeigt verwenden muss, um die richtige Ansicht zu identifizieren.

Benutzeravatar von Abhinav Manchanda
Abhinav Manchanda

Du kannst den … benutzen replaceText Methode.

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

  • Die Funktion replaceText() funktioniert! Das hat mich gerettet. Scheint, dass typeText() einige Probleme mit der Eingabetastatur hat.

    – herbertD

    10. Dezember 2015 um 6:44 Uhr

Drei Dinge zum Ausprobieren:

1. Sie können Performances nacheinander ausführen.

onView(...)
    .perform(clearText(), typeText("Some Text"));

2. Da ist ein aufgezeichnete Ausgabe auf der Espresso-Seite was als ungültig markiert wurde (aber immer noch ein Fehler ist). Eine Problemumgehung hierfür besteht darin, den Test zwischendurch anzuhalten.

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. Sind Sie absolut sicher, dass Ihr EditText den Text „Test“ enthält?

So setzen Sie den Wert in EditText mit Espresso ganz einfach

onView(withId(R.id.yourIdEditText)).perform(typeText("Your Text"))

  • OP gibt an: „Beachten Sie, dass ich in diesem Szenario keine Ressourcen-ID oder ähnliches verwenden kann und die Kombination wie oben gezeigt verwenden muss, um die richtige Ansicht zu identifizieren.“ …

    – Bö macht Blau

    23. April 2020 um 5:56 Uhr

Ich hatte ein ähnliches Problem und habe es mit dem containsString-Matcher und Class.getSimpleName() gelöst. So was:

onView(withClassName(containsString(PDFViewPagerIVZoom.class.getSimpleName()))).check(matches(isDisplayed()));

Sie können den vollständigen Code sehen hier

Du könntest zwei Dinge ausprobieren. Zuerst würde ich versuchen, zu verwenden

onView(withId(<id>).perform... 

Auf diese Weise hätten Sie immer Zugriff auf das EditText-Feld, auch wenn andere EditText-Felder auf dem Bildschirm angezeigt werden.

Wenn dies nicht möglich ist, können Sie Ihre Leistungsaufrufe aufteilen.

onView(allOf(withClassName(endsWith("EditText")),withText(is("Test")))).perform(clearText());
onView(withClassName(endsWith("EditText"))).perform(click());
onView(withClassName(endsWith("EditText"))).perform(typeText("Another Test");

  • Danke für die Antwort. Leider gibt es mehrere EditTexts in der Aktivität, die programmgesteuert ohne IDs generiert werden, sodass keiner dieser Vorschläge funktioniert.

    Benutzer1596371

    21. Mai 2014 um 20:55 Uhr

  • Aha. Vielleicht könnten Sie jedem von Ihnen erstellten EditText ein Tag setzen und die Ansicht basierend auf diesem Tag finden. Das Tag darf nur zum Testen verwendet werden, aber es würde Ihnen zumindest etwas geben, um die EditText-Felder zu unterscheiden. Andererseits kann dies gegen die Bedingung verstoßen, die Sie am Ende Ihrer Frage erwähnen (ich habe diesen Teil übersehen, bevor ich geantwortet habe).

    – Maxwell

    21. Mai 2014 um 21:18 Uhr


  • Danke für die Antwort. Leider gibt es mehrere EditTexts in der Aktivität, die programmgesteuert ohne IDs generiert werden, sodass keiner dieser Vorschläge funktioniert.

    Benutzer1596371

    21. Mai 2014 um 20:55 Uhr

  • Aha. Vielleicht könnten Sie jedem von Ihnen erstellten EditText ein Tag setzen und die Ansicht basierend auf diesem Tag finden. Das Tag darf nur zum Testen verwendet werden, aber es würde Ihnen zumindest etwas geben, um die EditText-Felder zu unterscheiden. Andererseits kann dies gegen die Bedingung verstoßen, die Sie am Ende Ihrer Frage erwähnen (ich habe diesen Teil übersehen, bevor ich geantwortet habe).

    – Maxwell

    21. Mai 2014 um 21:18 Uhr


1393710cookie-checkAktualisieren eines EditText mit Espresso

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy