Тестирование AutoCompleteTextView с эспрессо

Я использую Espresso для тестирования приложения с несколькими AutoCompleteTextViews. Для одного конкретного теста появляется всплывающее окно автозаполнения, но я хочу просто проигнорировать его и перейти к следующему TextView, Как я могу это сделать? Мои идеи состоят в том, чтобы либо смоделировать нажатие кнопки "Назад", либо смоделировать нажатие во всплывающем окне.

Обновить:

Я пытаюсь следующее, чтобы нажать на всплывающее окно автозаполнения:

onView(withId(R.id.brand_text))
        .perform(scrollTo(), typeText(card.getBrand()));
onData(allOf(is(instanceOf(String.class)), is(card.getBrand())))
        .inRoot(isPlatformPopup())
        .perform(click());
onView(withId(R.id.brand_text))
        .check(matches(withText(card.getBrand())));

Теперь проблема в том, что в некоторых случаях введенный текст не имеет совпадений при автозаполнении, поэтому всплывающее окно не появляется. Как я могу условно выполнить щелчок в зависимости от того, совпадает или нет представление?

1 ответ

Решение

Моим решением было добавить UiDevice объект из UI Automator для моего теста:

 UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

Тогда я звоню UiDevice.pressEnter() перейти к следующему TextView,

device.pressEnter();

Проблема заключается в том, что это не работает, как ожидалось, из коробки. Я также добавил View.OnKeyListener для каждого AutoCompleteTextView обрабатывать событие ввода ключа. На данный момент я добавляю прослушиватель к каждому представлению и в явном виде указываю, какие запросы просмотра фокусируются на событии клавиши Enter.

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // ...

    brandText.setOnKeyListener(new View.OnKeyListener() { 
        @Override 
        public boolean onKey(View v, int keyCode, KeyEvent event) { 
            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_ENTER) { 
                yearText.requestFocus(); 
                return true; 
            } 

            return false; 
        } 
    });

    //...
}

Это не идеально. В конце концов я планирую обобщить это, возможно, с пользовательским компонентом, который наследует от AutoCompleteTextView который обрабатывает клавишу ввода, как я ожидаю. Это отправит фокус на "следующий" вид.

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