Ответ 1
Вы можете использовать метод replaceText
.
onView(allOf(withClassName(endsWith("EditText")), withText(is("Test"))))
.perform(replaceText("Another test"));
Я пытаюсь обновить 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. Как мне это сделать?
Обратите внимание, что я не могу использовать идентификатор ресурса или подобное в этом сценарии и должен использовать комбинацию, как показано выше, чтобы определить правильный вид.
Вы можете использовать метод replaceText
.
onView(allOf(withClassName(endsWith("EditText")), withText(is("Test"))))
.perform(replaceText("Another test"));
Три вещи, которые нужно попробовать:
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"?
У меня была аналогичная проблема, и я решил ее использовать, используя matchString matcher и Class.getSimpleName(). Вот так:
onView(withClassName(containsString(PDFViewPagerIVZoom.class.getSimpleName()))).check(matches(isDisplayed()));
Вы можете увидеть полный код здесь
Вы можете попробовать две вещи. Сначала я попытаюсь использовать
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");
Чтобы установить значение в EditText с эспрессо просто так
onView(withId(R.id.yourIdEditText)).perform(typeText("Your Text"))