查找没有键的元素

Finds Element without key

我对在测试中使用 flutter 驱动程序还是个新手,但据我所知,我们可以使用很少的标识符来定位/识别元素,例如按文本、按类型等

但问题是,我要测试的应用程序没有我可以用来定位它们的标识符(如果我错了,请纠正我)..应用程序的小部件代码看起来像这个

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

该小部件位于扩展 StatefulWidget.

的 class 上

如何在我的测试脚本中找到该图标并单击它?我可以使用这样的东西吗?我应该使用什么类型的取景器? (byValueKey?bySemanticLabel?byType?还是什么?)

static final arrowKey = find.byValueKey(LoginKey.nextButton);
TestDriverUtil.tap(driver, arrowKey);
**In Lib directory dart class for connecting that widget**

class Testing extends StatelessWidget {

  Testing();

  // This widget is the root of your application.
  Widget build(BuildContext context) {

    return MaterialApp(
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      home: YourClass(), // Next button containing class that need to test
    );
  }
}

**In Test directory**

testWidgets('Next widget field test', (WidgetTester tester) async {

      // Build our app and trigger a frame.
      await tester.pumpWidget(Testing());
      // find Widget
      var buttonFind = find.byIcon(Icons.arrow_forward);
      expect(buttonFind, findsOneWidget);

      IconButton iconButton = tester.firstWidget(buttonFind);
      expect(iconButton.color, Colors.blue);
    });

我们在 Flutter Driver 中有文本和值检查,但如果您没有,您可以随时进入应用程序的层次结构。 我所说的层次结构是指按钮具有修复或特定父级权利吗?

让我们在这里举个例子,我们有 Align > Container > IconButton > Icon widget hierarchy 这对其他人来说是不正确的,比如可能有 IconButton 但没有 Container 父级。 或 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));
});

要检查多个 IconButtons 与父级具有相同的对齐方式,我们需要有一些区别,比如父级应该有文本视图或其他小部件。

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

通常我会像上面那样将代码拆分到单独的文件中并检查该小部件。

但最终会发现该小部件的一些独特之处,您可以对其进行处理。