Драйвер Flutter - введите текст в поле за пределами экрана

Я пытаюсь написать интеграционный тест для экрана с несколькими TextFormFields. Для каждого теста я просто:

  1. Касание текстового поля
  2. Ввод текста
  3. Проверка наличия текста в текстовом поле.

Используя драйвер 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'));

    });

Который успешно ввел текст в последнее текстовое поле после первой прокрутки.

Надеюсь это поможет.

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