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 及其元素的主要内容,如果未能解决你的问题,请参考以下文章

IOS工程Flutter白屏

IOS工程Flutter白屏

IOS工程Flutter白屏

IOS工程Flutter白屏

ScrollView RenderFlex 溢出 - Flutter

flutter 保持页面状态