Находит элемент без ключа

Я все еще новичок в использовании драйвера флаттера при тестировании, но, насколько я знаю, есть несколько идентификаторов, которые мы можем использовать для поиска / идентификации элементов, например, по тексту, по типу и т. д.

Но проблема в том, что приложение, которое я хочу протестировать, не имеет идентификатора, который я могу использовать, чтобы найти их (пожалуйста, поправьте меня, если я ошибаюсь) .. код виджета приложения выглядит следующим образом

  Widget _buildNextButton() {
    return Align(
      alignment: Alignment.bottomRight,
      child: Container(
        child: IconButton(
          icon: Icon(Icons.arrow_forward),
          onPressed: () => _controller.nextPage(),
        ),
      ),
    );
  }

где этот виджет находится в классе, расширяющем StatefulWidget.

Как я могу найти этот значок в моем тестовом сценарии и щелкнуть по нему? я могу использовать что-то подобное? И какой вид искателя мне следует использовать? (byValueKey? bySemanticLabel? byType? или как?)

static final arrowKey = find.byValueKey(LoginKey.nextButton);
TestDriverUtil.tap(driver, arrowKey);

person thekucays    schedule 22.10.2020    source источник


Ответы (2)


У нас есть проверки текста и значений здесь, в драйвере Flutter, но если у вас их нет, вы всегда можете перейти по иерархии приложения. что я имею в виду под иерархией, так что кнопка имеет исправление или конкретное родительское право?

Возьмем здесь ваш пример. У нас есть Align ›Container› IconButton ›Иерархия виджетов Icon, которая не будет верна для других, например, может быть IconButton, но не с родительским контейнером. или StreamBuilder, или что-нибудь, что мы можем придумать.

Widget _buildNextButton() {
    return Align(
      alignment: Alignment.bottomRight,
      child: Container(
        child: IconButton(
          icon: Icon(Icons.arrow_forward),
          onPressed: () => print("clicked button"),
        ),
      ),
    );
  }

Эта иерархия должна быть по крайней мере идеальной для подхода «сверху вниз» или «снизу вверх».

Под подходом сверху вниз я подразумеваю, что у Align должен быть IconButton, а для подхода снизу вверх мы говорим, что IconButton должен иметь виджет Align в качестве родителя.

Здесь я использовал подход сверху вниз, поэтому то, что я проверяю из кода ниже, находит IconButton, который является потомком Align Widget. также я добавил firstMatchOnly true, поскольку я проверял, что произойдет, если одинаковая иерархия появится для обоих, поэтому

test('IconButton find and tap test', () async {
  var findIconButton = find.descendant(of: find.byType("Align"), matching: find.byType("IconButton"), firstMatchOnly: true);
  await driver.waitFor(findIconButton);
  await driver.tap(findIconButton);

  await Future.delayed(Duration(seconds: 3));
});

чтобы проверить наличие нескольких кнопок IconButton с тем же выравниванием, что и у родителя, нам нужно иметь некоторую разницу, например, у родительского элемента должно быть текстовое представление или другой виджет.

find.descendant(of: find.ancestor(
                  of: find.byValue("somevalue"),
                  matching: find.byType("CustomWidgetClass")), matching: find.byType("IconButton"), firstMatchOnly: true)

обычно я использую что-то вроде выше, где я разделил код в отдельный файл и проверяю этот виджет.

Но в конечном итоге найдите что-то уникальное в этом виджете, и вы сможете поработать над этим.

person Parth Dave    schedule 03.11.2020
comment
я не могу найти метод byValue (), или вы имеете в виду byValueKey ()? - person thekucays; 04.11.2020
comment
это сработало для меня, спасибо за четкое объяснение, не могли бы вы увидеть здесь мой другой вопрос? я застрял с другой вещью драйвера флаттера stackoverflow.com/questions/64682323/ - person thekucays; 04.11.2020
comment
обязательно проверим это также - person Parth Dave; 05.11.2020

person    schedule
comment
это тоже работает при интеграционном тестировании? потому что я работаю над написанием интеграционных тестов - person thekucays; 23.10.2020
comment
Да, вы также можете провести интеграционное тестирование. - person Nadeem Abbas; 23.10.2020
comment
Какую библиотеку я должен использовать при тестировании интеграции, кстати? потому что в библиотеке драйверов флаттера нет find.byIcon () - person thekucays; 27.10.2020
comment
это из библиотеки модульного тестирования flutter_test, а не библиотеки драйверов флаттера. Трудно объединить оба, но в любом случае, кто хочет объединить бизнес-тестирование и тестирование пользовательского интерфейса в одном тестовом примере, не имеет смысла. - person Parth Dave; 06.11.2020