Обновление EditText с помощью Espresso

Я пытаюсь обновить EditText как часть теста Espresso с помощью:

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

Однако я получаю следующую ошибку:

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

Разбирая тестовую строку, я вижу, что это происходит после выполнения clearText(), поэтому я предполагаю, что повторы запускаются перед каждым perform и не выполняются до второго действия. Хотя это имеет смысл, это оставляет мне несколько смущение относительно того, как обновить EditText с помощью Espresso. Как мне это сделать?

Обратите внимание, что я не могу использовать идентификатор ресурса или подобное в этом сценарии и должен использовать комбинацию, как показано выше, чтобы определить правильный вид.

Ответ 1

Вы можете использовать метод replaceText.

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

Ответ 2

Три вещи, которые нужно попробовать:

1. Вы можете запускать выполнение последовательно.

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

2. На странице Espresso есть запись которая была отмечена как недопустимая (но по-прежнему очень большая ошибка). Обходной путь для этого - приостановить выполнение промежуточных проверок.

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. Вы абсолютно уверены, что ваш EditText содержит текст "Test"?

Ответ 3

У меня была аналогичная проблема, и я решил ее использовать, используя matchString matcher и Class.getSimpleName(). Вот так:

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

Вы можете увидеть полный код здесь

Ответ 4

Вы можете попробовать две вещи. Сначала я попытаюсь использовать

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

Таким образом, вы всегда будете иметь доступ к полю EditText, даже если на экране есть другие поля EditText.

Если это не вариант, вы можете разделить свои вызовы.

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

Ответ 5

Чтобы установить значение в EditText с эспрессо просто так

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