Тестирование 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
который обрабатывает клавишу ввода, как я ожидаю. Это отправит фокус на "следующий" вид.