Flutter Integration Screenshot not working for Android

103

Adding an additional tester.pumpAndSettle(); after convertFlutterSurfaceToImage fixed the problem

  await tester.pumpAndSettle();
  await binding.convertFlutterSurfaceToImage();
  await tester.pumpAndSettle();
Share:
103
Ryan Heitner
Author by

Ryan Heitner

Updated on January 04, 2023

Comments

  • Ryan Heitner
    Ryan Heitner over 1 year

    I am trying to capture screenshots using integration_test but the

     await binding.takeScreenshot('${platform}-1'); 
    

    Hangs for Android with a message

    VMServiceFlutterDriver: request_data message is taking a long time to complete...
    

    The app is the Flutter default app with

    import 'package:flutter_driver/driver_extension.dart';
    import 'package:flutter_test/flutter_test.dart';
    import 'package:integration_test/integration_test.dart';
    import 'dart:io';
    import 'package:flutter_stam/main.dart' as app;
    void main() {
      final IntegrationTestWidgetsFlutterBinding binding = IntegrationTestWidgetsFlutterBinding();
    
      group('Screenshot', () {
        testWidgets('Screenshot-1', (WidgetTester tester) async {
          String platform;
          if (Platform.isAndroid) {
            platform = 'android';
          } else if (Platform.isIOS) {
            platform = 'ios';
          } else {
            platform = Platform.operatingSystem;
          }
    
          app.main();
          await tester.pumpAndSettle();
          // Verify the counter starts at 0.
          expect(find.text('0'), findsOneWidget);
    
          // Finds the floating action button to tap on.
          final Finder fab = find.byTooltip('Increment');
    
          // Emulate a tap on the floating action button.
          await tester.tap(fab);
    
          // Trigger a frame.
          await tester.pumpAndSettle();
          await binding.convertFlutterSurfaceToImage();
          await binding.takeScreenshot('${platform}-screenshot-1');
    
          // Verify the counter increments by 1.
          expect(find.text('1'), findsOneWidget);
        });
      });
    }
    

    script

    #!/bin/zsh
    
    flutter drive \
      --driver=integration_test/driver.dart \
      --target=integration_test/app_test.dart \
      -d "iPhone 13 Pro Max"
    
    flutter drive \
      --driver=integration_test/driver.dart \
      --target=integration_test/app_test.dart \
      -d "emulator-5554"
    

    Driver

    import 'dart:io';
    import 'package:integration_test/integration_test_driver_extended.dart';
    
    Future<void> main() async {
      try {
        await integrationDriver(
          onScreenshot: (String screenshotName, List<int> screenshotBytes) async {
            final File image = await File('screenshots/$screenshotName.png')
                .create(recursive: true);
            image.writeAsBytesSync(screenshotBytes);
            return true;
          },
        );
      } catch (e) {
        print('An error occurred: $e');
      }
    }
    

    For iOS, I also had an issue but I managed to solve it

    I was getting an error

    The following MissingPluginException was thrown running a test:
    MissingPluginException(No implementation found for method
    captureScreenshot on channel plugins.flutter.io/integration_test)
    

    I changed IntegrationTestPlugin.m

    + (void)registerWithRegistrar:(NSObject<FlutterPluginRegistrar> *)registrar {
        [[IntegrationTestPlugin instance] setupChannels:registrar.messenger];
    }