3
votes

Pilote Flutter: Test BottomNavigationBarItem

Comment tester BottomNavigationBarItems via FlutterDriver ?

FlutterDriver permet d'accéder aux widgets via text , byValueKey , byTooltip et byType .

Mais aucune de ces méthodes ne fonctionne pour mon application pour les raisons suivantes:

  • texte : l'application est localisée et je dois tester l'application dans plusieurs langues.

  • byValueKey : les éléments BottomNavigationBarItems ne possèdent pas de propriétés key .

  • byTooltip : BottomNavigationBarItems n'a pas de propriétés toolTip .

  • byType : byType renvoie uniquement la première correspondance du type et aucune liste (nécessaire car j'ai plusieurs onglets).

Merci beaucoup!

Acclamations.


0 commentaires

3 Réponses :


3
votes

Je ne sais pas si vous avez trouvé la réponse à cette question, mais je vais publier ici une solution qui fonctionne pour moi. Fondamentalement, BottomNavigationBar a une propriété key que vous devez utiliser. Une fois que Flutter Driver a identifié cette clé, vous pouvez dire au pilote de taper sur l'un de ses éléments enfants, c'est-à-dire BottomNavigationBarItem .

Mon écran a 2 bottomNavigationBarItems comme indiqué ci-dessous et je clé définie pour leur widget parent, c'est-à-dire BottomNavigationBar comme suit:

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

 entrez la description de l'image ici

Et j'ai écrit un test de pilote de flutter pour taper sur les deux éléments qui fonctionnaient parfaitement.

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),)
          )
        ],
      ),

Résultat:

 entrez la description de l'image ici


2 commentaires

Merci pour votre réponse. Votre solution fonctionne, mais malheureusement pas pour moi. Mon application est localisée et a donc des textes différents en fonction de votre langue.


@basedgod ne pouvons-nous pas utiliser la clé sur le widget Texte? `` BottomNavigationBarItem (icon: Icon (Icons.settings), title: Text ('Settings', key: const Key ('settings'),), '' cela semble fonctionner pour moi.



-2
votes
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');
    });

2 commentaires

Merci pour votre réponse, mais veuillez expliquer le code et comment / pourquoi cela fonctionne. Juste avec du code, il est difficile de comprendre la réponse.


Ajoutez le widget "InkWell" comme titre pour BottomNavigationBarItem et ajoutez du texte en tant qu'enfant pour InkWell. Vous pouvez maintenant avoir une clé anglaise statique pour le widget InkWell, qu'il n'est pas nécessaire de changer en fonction de la locale et après cela, en utilisant l'api "driver.tap (find.byValueKey ('key'))", vous pouvez obtenir cette fonctionnalité ontap BottomNavigationBarItem.



1
votes

Comme mentionné par @bsr et @ user12563357- vous pouvez utiliser la clé sur le widget Texte:

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

et trouver le texte pour cliquer sur l'élément de la barre dans test:

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

btw: vous pouvez également trouver BottomNavigationBarItem en utilisant find.ancestor

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'),)
          )
        ],
      ),

mais vous ne pouvez pas appuyer dessus.


0 commentaires