Flutter driver - введите текст в поле, находящееся вне экрана - PullRequest
1 голос
/ 27 февраля 2020

Я пытаюсь написать интеграционный тест для экрана с несколькими 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, которые находятся за пределами экрана (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'));
 });

1 Ответ

1 голос
/ 27 февраля 2020

Я попытался воссоздать ваше дело и смог успешно выполнить тест драйвера, который вводил текст в невидимое текстовое поле на экране, используя метод ScrollIntoView(). Вот что я сделал для демонстрации:

  • В main.dart имел серию textformfields с уникальным key для каждого, завернутую в Column, который был завернут в SingleChildScrollView:

enter image description here

Когда вы прокрутите вниз, вы увидите последнее текстовое поле с hintText Last TextField, которое не видно при запуске экрана.

enter image description here

Для этой настройки были написаны два теста драйвера для нажатия и ввода текста, как показано ниже:

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'));

    });

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

enter image description here

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

...