0

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

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

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

2 回答 2

1

我们在 Flutter Driver 中有文本和值检查,但如果你没有,你可以随时查看 app 的层次结构。我所说的层次结构是什么按钮有修复或特定的父权限?

让我们在这里举个例子,我们有 Align > Container > IconButton > Icon 小部件层次结构,这对于其他人来说是不正确的,比如可能有 IconButton 但不是 Container 父级。或 StreamBuilder 或任何我们能想到的东西。

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

这种层次结构应该至少是顶部底部或底部顶部方法的理想选择。

现在我所说的从上到下的方法是对齐必须有 IconButton,对于自下而上的方法,我们说 IconButton 必须有对齐小部件作为父级。

在这里,我采用了自上而下的方法,所以我从下面的代码中检查的是找到属于 Align Widget 的 IconButton。我还添加了 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));
});

要检查多个具有相同 Align 作为父级的图标按钮,我们需要有一些区别,例如父级应该具有文本视图或其他小部件。

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

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

但最终会找到该小部件的独特之处,然后您就可以着手处理了。

于 2020-11-03T11:35:08.293 回答
0
**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);
    });
于 2020-10-23T06:45:42.263 回答