Отключить автокоррекцию в тесте Эспрессо

Я написал тест 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 в вспомогательном методе.

Другие вопросы по тегам