Я пытаюсь написать интеграционный тест для экрана с несколькими 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, которые находятся за пределами экрана (ie. Не видны / находятся вне области просмотра), тест завершился неудачно с ошибкой тайм-аута.
Я попытался добавить scrollIntoView()
к тестам, чтобы сказать Flutter Driver прокручивать, пока поле не окажется в области просмотра. Ниже приведен пример:
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'));
});