Flutter驱动程序:测试BottomNavigationBarItem

时间:2019-04-01 17:56:04

标签: dart flutter flutter-test

如何通过 FlutterDriver 测试BottomNavigationBarItems?

FlutterDriver 允许通过文本 byValueKey byTooltip byType 访问窗口小部件。

但是由于以下原因,这些方法都无法在我的App中解决:

  • 文本:该应用程序已本地化,我需要以多种语言测试该应用程序。

  • byValueKey :BottomNavigationBarItem不具有 key 属性。

  • byTooltip :BottomNavigationBarItem不具有 toolTip 属性。

  • byType :byType仅返回该类型的第一个匹配项,并且不列出任何列表(因为我有多个标签,所以需要)。

非常感谢您!

干杯。

3 个答案:

答案 0 :(得分:1)

如@bsr和@ user12563357所述-您可以在文本小部件上使用

bottomNavigationBar: BottomNavigationBar(
        type: BottomNavigationBarType.shifting,
        key: Key('bottom'),
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.ac_unit),
            title: Text('First', key: Key('first'),)
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.cast),
            title: Text('Second', key: Key('second'),)
          )
        ],
      ),

并找到要在测试中的条形项目上单击的文本:

final firstItem = find.byValueKey('first');
await driver.tap(firstItem);

btw:您还可以使用 find.ancestor

找到BottomNavigationBarItem
find.ancestor(of: firstItem, matching: find.byType("BottomNavigationBarItem"));

但是您不能点击它。

答案 1 :(得分:0)

不知道您是否找到此问题的答案,但是我将在此处发布对我有用的解决方案。基本上,BottomNavigationBar具有您需要使用的key属性。 Flutter Driver识别出此键后,便可以告诉驱动程序点击其任何子项,即BottomNavigationBarItem

我的屏幕上有2个bottomNavigationBarItems,如下所示,我为其父窗口小部件即BottomNavigationBar定义了键:

bottomNavigationBar: BottomNavigationBar(
        type: BottomNavigationBarType.shifting,
        key: Key('bottom'),
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.ac_unit, color: Colors.green,),
            title: Text('First', style: TextStyle(color: Colors.black),)
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.cast, color: Colors.yellow,),
            title: Text('Second', style: TextStyle(color: Colors.black),)
          )
        ],
      ),

enter image description here

然后我写了一个flutter驱动程序测试,以同时使用两个效果都很好的项目。

test('bottomnavigationbar test', () async {
      await driver.waitFor(find.byValueKey('bottom'));
      await driver.tap(find.text('First'));
      print('clicked on first');
      await driver.tap(find.text('Second'));
      print('clicked on second too');
    });

结果:

enter image description here

答案 2 :(得分:-2)

bottomNavigationBar: BottomNavigationBar(
        type: BottomNavigationBarType.shifting,
        key: Key(`bottom`),
        items: [
          BottomNavigationBarItem(
            icon: Icon(Icons.ac_unit, color: Colors.green,),
            title: InkWell(child:Text(`First`, style: TextStyle(color: Colors.black),key:Key(`First`)),)
          ),
          BottomNavigationBarItem(
            icon: Icon(Icons.cast, color: Colors.yellow,),
            title:  InkWell(child:Text(`Second`, style: TextStyle(color: Colors.black),key:Key(`Second`)),)
          )
        ],
      ),


test(`bottomnavigationbar test`, () async {
      await driver.waitFor(find.byValueKey(`bottom`));
      await driver.tap(find.byValueKey(`First`));
      print('clicked on first');
      await driver.tap(find.byValueKey(`Second`));
      print('clicked on second too');
    });