Flutter Driver - 不定位 Flutter AlertDialog 及其元素
Posted
技术标签:
【中文标题】Flutter Driver - 不定位 Flutter AlertDialog 及其元素【英文标题】:Flutter Driver - Does not locate Flutter AlertDialog and its elements 【发布时间】:2020-03-26 11:15:24 【问题描述】:我的 flutter 应用中有一个 Flutter AlertDiaog
。
使用 Flutter Driver,我无法点击 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
包裹了两个文本,这样我们就可以点击它们了。另外,我为每个GestureDetector
使用了key
属性来唯一标识这两个文本。
在您的驱动程序测试中,您只需使用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');
);
希望这能回答你的问题。
【讨论】:
达山,感谢您的回复。在您上面的主要代码中,我看到您在调用 showDialog() 时没有使用“return”。如果您在 tap 下添加此类操作,您是否能够在屏幕上返回照片库?对我来说,flutter 驱动程序直到现在都无法找到 AlertDialog,只是因为我在 showDialog() 调用中使用了“return”,因此实际上在点击后返回了照片库。 我根据你的回复试了一下,在onPressed
方法上直接返回了alertDialog
,效果和预期一样。
该解决方案仅在我使用 runUnsynchronized 方法后才起作用,如下所示: await driver.runUnsynchronized(() async await driver.tap(find.byValueKey('firstOptionKey')); ); 以上是关于Flutter Driver - 不定位 Flutter AlertDialog 及其元素的主要内容,如果未能解决你的问题,请参考以下文章