Драйвер Flutter - не находит Flutter AlertDialog и его элементы
У меня флаттер AlertDiaog
это появляется в моем приложении Flutter. Используя драйвер Flutter, я не могу нажать ни на Flutter AlertDialog, ни на какой-либо элемент AlertDialog. Есть ли способ нажать на любой AlertDialog, который появляется в моем приложении?
Я пробовал все нижеприведенное, но все равно не повезло:
- Первый:
await driver.tap(find.byType('ModalBarrier'));
print('*******TAPPED - ModalBarrier*******');
- Второй
await driver.tap(find.byType('AlertDialog'));
print('*******TAPPED - AlertDialog*******');
- В третьих
await driver.tap(find.text('Gallery')); // Tapping 'Gallery', can access pics
print('*******TAPPED - Gallery *******');
1 ответ
Идея состоит в том, чтобы сначала идентифицировать текст в AlertDialog
уникальным ключом, сообщить об этом водителю, а затем выполнить tap
действие на нем. В свой основной код добавьтеkey
свойство родительского виджета, имеющего Text
вы хотите нажать, например: я показываю простой AlertDialog
которые показывают 2 варианта, как показано ниже:
Код для этого:
showDialog(context: context,
builder: (BuildContext context) {
return AlertDialog(
content: SingleChildScrollView(
child: ListBody(
children: <Widget>[
GestureDetector(
key: Key('firstOptionKey'),
child: Text('Take a picture'),
onTap: () {},
),
Padding(
padding: EdgeInsets.all(8.0),
),
GestureDetector(
key: Key('secondOptionKey'),
child: Text('Select from gallery'),
onTap: () {},
),
],
),
),
);
});
Как видите, я заключил оба текста в GestureDetector
что позволяет нам нажимать на них. Также я использовалkey
собственность для каждого GestureDetector
чтобы однозначно идентифицировать оба текста.
Затем в тесте драйвера вам просто нужно идентифицировать каждый текст, используя byValueKey
и попросите водителя нажать на него, как показано ниже:
test('test dialog', () async {
final firstText = find.byValueKey('firstOptionKey');
await driver.waitFor(find.text('Tap'));
await driver.tap(find.text('Tap')); // tap on this button to open alertDialog
await driver.waitFor(firstText); // wait for flutter driver to locate and identify the element on screen
await driver.tap(firstText);
print('tapped on it');
});
Надеюсь, что это ответ на ваш вопрос.