Отключить автокоррекцию в тесте Эспрессо
Я написал тест Espresso, который записывает некоторый текст в TextView, выполняет действие и затем проверяет, остается ли текст в TextView таким же.
Тест не пройден на одном из тестовых устройств (Huawei P20, Android 8.1.0), поскольку введенный текст автоматически корректируется (с 1234 5678
в 12th 5678
). И это не проходит мой тест. Текст не исправляется автоматически, когда я вручную ввожу те же цифры.
Вот как я ввожу текст в моем тесте эспрессо:
onView(withId(R.id.reference_value))
.perform(scrollTo(), click())
.check(matches(isDisplayed()))
.perform(typeText("1234 5678"));
closeSoftKeyboard();
Я знаю, что мог бы просто изменить введенный текст на что-то, что не будет автоматически исправлено. Но я хотел бы иметь решение, которое обычно гарантирует, что введенный текст не будет изменен на что-то другое. В идеале без необходимости вручную изменять конфигурацию моего тестового устройства.
У кого-нибудь из вас есть идеи, как мне это сделать?
2 ответа
Один способ, который работает для меня, это использовать replaceText()
вместо этого, хотя это все еще кажется чем-то вроде взлома.
Другой вариант может заключаться в том, чтобы отключить автозамену через некоторый вызов Android API или вручную через пользовательский интерфейс, как для анимации.
Эта проблема возникает с некоторыми клавиатурами. Для меня это было с клавиатурой Microsoft SwiftKey, которая была установлена моей клавиатурой по умолчанию.
Два решения, которые сработали для меня:
Решение 1. Измените тип ввода на
TYPE_TEXT_FLAG_NO_SUGGESTIONS
во время теста при использовании
typeText
что отключает предложения и исправления для этого представления.
Пример:
@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelloWorldEspressoTest {
@Rule
public ActivityScenarioRule<MainActivity> activityScenarioRule
= new ActivityScenarioRule<>(MainActivity.class);
@Before
public void setUp() {
// get the view & set the input type
activityScenarioRule.getScenario().onActivity(activity ->
((EditText) activity.findViewById(R.id.etHello))
.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS));
}
@Test
public void testText() {
onView(withId(R.id.etHello)).perform(typeText("Smoth go"));
onView((withId(R.id.etHello))).check(matches(withText("Smoth go")));
}
}
Решение 2. Использование собственного
ViewAction
Helper.java
-> Этот файл помещается в тот же пакет test с test.
public class Helper {
public static ViewAction setTextInEt(final String value){
return new ViewAction() {
@Override
public Matcher<View> getConstraints() {
return allOf(isDisplayed(), isAssignableFrom(EditText.class));
}
@Override
public void perform(UiController uiController, View view) {
((EditText) view).setText(value);
}
@Override
public String getDescription() {
return "set text";
}
};
}
}
Тестовый класс:
@RunWith(AndroidJUnit4.class)
@LargeTest
public class HelloWorldEspressoTest {
@Rule
public ActivityScenarioRule<MainActivity> activityScenarioRule
= new ActivityScenarioRule<>(MainActivity.class);
@Test
public void testText() {
onView(withId(R.id.etHello)).perform(Helper.setTextInEt("Smoth go"));
onView((withId(R.id.etHello))).check(matches(withText("Smoth go")));
}
}
До сих пор решение 2 работало для меня очень хорошо. До этого
smoth
текст был автоматически исправлен на
smooth
каждый раз.
Это можно сделать и для просто заменить
EditText
к
TextView
в вспомогательном методе.