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.
3 Réponses :
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'); });
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:
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.
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'); });
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.
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.