You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter Integration Test截图无法捕获含状态栏全屏问题求助

Flutter Integration Test 截图缺失状态栏,顶部内容截断问题

在使用Flutter的integration_test执行截图操作时,生成的截图未包含应用状态栏区域,页面顶部内容被截断,无法获取包含状态栏的完整屏幕截图。

相关代码及运行命令:

screenshot_test.dart

import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:integration_test/integration_test.dart';
import 'package:end_point/main.dart' as app;

void main() {
  IntegrationTestWidgetsFlutterBinding.ensureInitialized();
  final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  group('App test', () {
    testWidgets("test infinite pagination", (tester) async {
        
      app.main();
      await tester.pumpAndSettle();
      await binding.convertFlutterSurfaceToImage();
      await tester.pumpAndSettle();
      await binding.takeScreenshot('screenshot-home');
      await tester.pumpAndSettle();
    });
  });
}

integration_test.dart

import 'dart:io';
import 'package:integration_test/integration_test_driver_extended.dart';

Future<void> main() async {
  await integrationDriver(
    onScreenshot: (String screenshotName, List<int> screenshotBytes) async {
      final File image = File('ss/$screenshotName.png');
      image.writeAsBytesSync(screenshotBytes);
      // Return false if the screenshot is invalid.
      return true;
    },
  );
}

运行命令

flutter drive 
--driver=test_driver/integration_test.dart 
--target=integration_test/screenshot_test.dart 
-d iPhone SE

解决方案

问题根源是convertFlutterSurfaceToImage()方法仅捕获Flutter负责绘制的内容区域,系统状态栏属于原生系统层级,不在Flutter Surface范围内,因此会被排除。

方法一:移除convertFlutterSurfaceToImage()调用

默认情况下,takeScreenshot()会尝试捕获整个屏幕(包含状态栏),无需额外转换Flutter Surface。修改后的测试代码如下:

void main() {
  final binding = IntegrationTestWidgetsFlutterBinding.ensureInitialized();

  group('App test', () {
    testWidgets("test infinite pagination", (tester) async {
      app.main();
      await tester.pumpAndSettle();
      // 移除convertFlutterSurfaceToImage调用
      await binding.takeScreenshot('screenshot-home');
      await tester.pumpAndSettle();
    });
  });
}

注:已移除重复的IntegrationTestWidgetsFlutterBinding.ensureInitialized()调用,避免冗余。

方法二:iOS权限补充配置(若方法一无效)

部分iOS设备可能需要在项目的Info.plist中添加屏幕录制权限声明,确保测试能访问完整屏幕:

<key>NSScreenCaptureUsageDescription</key>
<string>需要屏幕录制权限以生成测试截图</string>

内容的提问来源于stack exchange,提问作者Lim Jiexian

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 01:47:17