Драйвер Flutter - введите текст в поле за пределами экрана
Я пытаюсь написать интеграционный тест для экрана с несколькими TextFormFields. Для каждого теста я просто:
- Касание текстового поля
- Ввод текста
- Проверка наличия текста в текстовом поле.
Используя драйвер Flutter, для каждого TextFormField хорошо работает следующее:
final myTextField = find.byValueKey('TextField');
test('Enter text into text field', () async {
await driver.tap(myTextField);
await driver.enterText('Hello world');
await driver.waitFor(find.text('Hello world'));
});
Однако для любых TextFormFields, которые находятся за пределами экрана (т. Е. Не видны / за пределами области просмотра), тест завершается с ошибкой тайм-аута.
Я пробовал добавить scrollIntoView()
к тестам, чтобы сообщить драйверу Flutter, что нужно прокручивать, пока поле не окажется в области просмотра. Ниже приведен пример:
final myTextField = find.byValueKey('TextField');
test('Enter text into text field', () async {
await driver.scrollIntoView(myTextField); // Added
await driver.tap(myTextField);
await driver.enterText('Hello world');
await driver.waitFor(find.text('Hello world'));
});
Однако тесты продолжают терпеть неудачу с ошибкой тайм-аута:
FlutterDriver: tap message is taking a long time to complete...
00:39 +0 -1: My screen: Enter text into text field [E]
TimeoutException after 0:00:30.000000: Test timed out after 30 seconds.
Как проверить поля TextFormFields за пределами области просмотра?
Обновление: я обнаружил, что с помощьюscrollUntilVisible()
предпочтительнее scrollIntoView()
, поскольку элемент, возможно, еще не был отрисован и поэтому не может быть найден (см. https://flutter.dev/docs/cookbook/testing/integration/scrolling).
scrollUntilVisible()
успешно автоматически прокручивает экран и находит элемент, который был вне экрана. Однако после обнаружения экран по какой-то причине автоматически возвращается наверх, в результате чего элемент снова оказывается вне экрана. Что происходит?
final myTextField = find.byValueKey('TextField');
final myListView = find.byValueKey('ListView');
test('Enter text into text field', () async {
await scrollUntilVisible(
myListView,
finder,
// To scroll down the list, provide a negative value to dyScroll.
// Ensure that this value is a small enough increment to
// scroll the item into view without potentially scrolling past it.
//
// To scroll through horizontal lists, provide a dxScroll
// property instead.
dyScroll: -100
);
await driver.tap(myTextField);
await driver.enterText('Hello world');
await driver.waitFor(find.text('Hello world'));
});
1 ответ
Я попытался воссоздать ваш случай и смог успешно запустить тест драйвера, который ввел текст в невидимое текстовое поле на экране, используя ScrollIntoView()
метод. Вот что я сделал для демонстрации:
- В
main.dart
, имел сериюtextformfields
имея уникальныйkey
за каждый, завернутый внутрьColumn
который был завернут вSingleChildScrollView
:
Когда мы прокрутим вниз, вы увидите последнее текстовое поле с hintText
Last TextField
который не отображается при запуске экрана.
Для этой настройки написаны два теста драйверов, чтобы нажать и ввести текст, как показано ниже:
test('Enter text into first text field', () async {
await driver.tap(myTextField);
await driver.enterText('Hello world');
await driver.waitFor(find.text('Hello world'));
});
test('Enter text into last text field', () async {
await driver.scrollIntoView(myTextField21);
await driver.tap(myTextField21);
await driver.enterText('Hello');
await driver.waitFor(find.text('Hello'));
});
Который успешно ввел текст в последнее текстовое поле после первой прокрутки.
Надеюсь это поможет.