как проверить BottomNavigationBarItems через Флаттер Драйвер?
Флаттер Драйвер позволяет получить доступ к виджетам через текст, byValueKey, по подсказке и по типу.
Но ни один из этих методов не работает для моего приложения по следующим причинам:
текст: Приложение локализовано, и мне нужно протестировать приложение на нескольких языках.
byValueKey: элементы BottomNavigationBarItem не имеют свойств ключ.
по подсказке: элементы BottomNavigationBarItem не имеют свойств всплывающая подсказка.
по типу: byType возвращает только первое совпадение типа, а не список (необходимо, потому что у меня несколько вкладок).
Большое спасибо!
Ваше здоровье.
Не уверен, что вы нашли ответ на этот вопрос, но я опубликую здесь решение, которое работает для меня. По сути, у 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),)
)
],
),
И я написал тест драйвера флаттера, чтобы коснуться обоих элементов, и он отлично работал.
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');
});
Результат:
@basedgod, разве мы не можем использовать ключ в виджете «Текст»? ``` BottomNavigationBarItem( icon: Icon( Icons.settings), title: Text( 'Settings', key: const Key('settings'), ),``` мне кажется, это работает.
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');
});
Спасибо за ваш ответ, но, пожалуйста, объясните код и как/почему он работает. Просто с кодом сложно понять ответ.
Добавьте виджет «InkWell» в качестве заголовка для BottomNavigationBarItem и добавьте Text в качестве дочернего элемента для InkWell. Теперь у вас может быть статический английский ключ для виджета InkWell, который не нужно менять в зависимости от локали, и после этого с помощью API «driver.tap(find.byValueKey('key'))» вы можете добиться этой функциональности BottomNavigationBarItem ontap.
Как упоминалось @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);
кстати: вы также можете найти BottomNavigationBarItem, используя найти предка
find.ancestor(of: firstItem, matching: find.byType("BottomNavigationBarItem"));
но вы не можете нажать на него.
Можно ли поставить ключ на Icon?
Спасибо за ваш ответ. Ваше решение работает, но, к сожалению, не для меня. Мое приложение локализовано и поэтому имеет разные тексты в зависимости от вашего языка.