Dart 颤振驱动器:测试底部导航气压表

Dart 颤振驱动器:测试底部导航气压表,dart,flutter,flutter-test,Dart,Flutter,Flutter Test,如何通过FlatterDriver测试BottomNavigationBarItems 驱动程序允许通过文本、按值键、按工具提示和按类型访问小部件 但这些方法都不适用于我的应用程序,原因如下: text:该应用程序已本地化,我需要用多种语言测试该应用程序 byValueKey:BottomNavigationBarItem没有key属性 byTooltip:底部导航BarItem没有工具提示属性 byType:byType只返回类型的第一个匹配项,不返回列表(需要,因为我有多个选项卡) 多谢

如何通过FlatterDriver测试BottomNavigationBarItems

驱动程序允许通过文本按值键按工具提示按类型访问小部件

但这些方法都不适用于我的应用程序,原因如下:

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

  • byValueKey:BottomNavigationBarItem没有key属性

  • byTooltip:底部导航BarItem没有工具提示属性

  • byType:byType只返回类型的第一个匹配项,不返回列表(需要,因为我有多个选项卡)

多谢各位


干杯。

不确定您是否找到了这个问题的答案,但我将在这里发布一个适合我的解决方案。基本上,
BottomNavigationBar
有一个您需要使用的
key
属性。一旦Flatter Driver识别出该键,您就可以告诉Driver点击它的任何子项,即
BottomNavigationBarItem

我的屏幕有2个
bottomNavigationBarItems
,如下所示,我为它们的父小部件ie
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),)
          )
        ],
      ),

我写了一个颤振驱动测试来测试这两个项目,这两个项目都非常有效

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');
    });
结果:


如@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);
顺便说一句:您还可以使用find.祖先

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

但是你不能点击它。

谢谢你的回答。你的解决方案有效,但不幸的是,对我来说不是。“我的应用程序是本地化的,因此根据您的语言有不同的文本。@basedgod我们不能使用文本小部件上的键吗?`”BottomNavigationBarItem(icon:icon(Icons.settings),title:Text('settings',key:const key('settings'),),“``这似乎对我有用。谢谢你的回答,但请解释代码以及它的工作方式/原因。仅凭代码很难理解答案。添加“InkWell”小部件作为BottomNavigationBarItem的标题,并作为InkWell的子项添加文本。现在,您可以为InkWell小部件提供静态英文键,无需根据区域设置进行更改,然后使用“driver.tap(find.byValueKey('key'))”api可以实现BottomNavigationBarItem ontap功能。
find.ancestor(of: firstItem, matching: find.byType("BottomNavigationBarItem"));