Flutter小部件测试点击-无法点击指定小部件上的测试

eyh26e7m  于 2022-11-17  发布在  Flutter
关注(0)|答案(3)|浏览(191)

输出以下警告后,我的小部件测试失败:
警告:使用finder“调用tap(),只调用一个文本为“Tab 2”的小部件(忽略后台小部件):文本(“选项卡2”,软换行:除换行符外不换行,溢出:淡入淡出,依赖关系:[MediaQuery,DefaultTextStyle])”派生的偏移量(Offset(600.0,23.0))不会命中指定小部件上的测试。flutter:可能小部件实际上不在屏幕上,或者另一个小部件遮挡了它,或者小部件无法接收指针事件。
我在测试中设置了一些延迟,看起来测试正在尝试点击正确的小部件-它没有脱离屏幕,没有被遮挡,并且能够在过去接收指针事件-不确定为什么它现在失败了。
下面是一个可重复的最小示例:

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DefaultTabController(
        length: 2,
        child: Scaffold(
          appBar: TabBar(
            labelColor: Color(0xff8391e4),
            tabs: [
              Tab(text: 'Tab 1'),
              Tab(text: 'Tab 2'),
            ],
          ),
          body: TabBarView(
            children: <Widget>[
              Text('Tab 1 Text'),
              Text('Tab 2 Text'),
            ],
          ),
        ),
      ),
    );
  }
}

void main() {
  TestWidgetsFlutterBinding.ensureInitialized();

  testWidgets('My Test', (WidgetTester tester) async {
    await tester.pumpWidget(MyApp());
    await tester.pumpAndSettle();

    // Warning thrown on this tap - tap never executed
    await tester.tap(find.text('Tab 2'));
    await tester.pumpAndSettle();

    // Test fails here
    expect(find.text('Tab 2 Text'), findsOneWidget);
  });
}
k97glaaz

k97glaaz1#

尝试将ensureVisible()设置在tap()之前:

// Warning thrown on this tap - tap never executed
await tester.ensureVisible(find.text('Tab 2'));
await tester.tap(find.text('Tab 2'));
await tester.pumpAndSettle();
z9zf31ra

z9zf31ra2#

我找到了一个解决问题的方法,但它可能不是一个通用的解决方案。这个测试所针对的应用程序是一个专门的网络应用程序,所以它被设计为在更大的屏幕上运行。当我在chrome上运行测试时,它会通过,但如果不小心运行,它会失败。
为了解决这个问题,我在一个更大的屏幕尺寸上运行测试,现在它毫无顾忌地通过了。所以如果你遇到A call to tap() ... that would not hit test on the specified widget错误,调整屏幕尺寸可能会解决这个问题。

testWidgets('My test', (WidgetTester tester) async {
      // Here we use physicalSizeTestValue to adjust the test screen size to
      // simulate running on a desktop computer which the app was designed for
      tester.binding.window.physicalSizeTestValue = Size(1080, 1920);
      tester.binding.window.devicePixelRatioTestValue = 1.0;
epfja78i

epfja78i3#

在我的例子中,当我有模态屏幕时,这是有效的:

await tester.tap(find.byKey(Key('some_key')), warnIfMissed: false);

相关问题