GitPedia

Patrol

Flutter-first UI testing framework. Ready for action!

From leancodepl·Updated June 19, 2026·View on GitHub·

[![patrol on pub.dev][patrol_badge]][patrol_link] [![patrol_cli on pub.dev][patrol_cli_badge]][patrol_cli_link] [![patrol_finders on pub.dev][patrol_finders_badge]][patrol_finders_link] [![patrol_discord]][patrol_discord_link] [![code style][leancode_lint_badge]][leancode_lint_link] [![patrol_github_stars]][patrol_github_link] [![patrol_x]][patrol_x_link] The project is written primarily in Dart, distributed under the Apache License 2.0 license, first published in 2022. It has gained significant community traction with 1,352 stars and 227 forks on GitHub. Key topics include: dart, flutter, flutter-test, greybox-testing, hacktoberfest.

Latest release: patrol_cli-v4.5.0-dev.1
June 19, 2026View Changelog →

Patrol

patrol on pub.dev
patrol_cli on pub.dev
patrol_finders on pub.dev
patrol_discord
code style
patrol_github_stars
patrol_x

A powerful, multiplatform E2E UI testing framework for Flutter apps that overcomes the limitations of integration_test by handling native interactions. Developed by LeanCode since 2022, battle-tested and shaped by production-grade experience.

Patrol promotional graphics

Learn more about Patrol:

How can we help you:

Patrol is an open-source framework created and maintained by LeanCode.
However, if your company wants to scale fast and accelerate Patrol’s
adoption, we offer a set of value-added services on top of the core framework.

You can find out more below:

Patrol custom finders

Flutter's finders are powerful, but not very intuitive to use.

We took them and made something awesome.

Thanks to Patrol's custom finders, you'll take your tests from this:

dart
testWidgets('signs up', (WidgetTester tester) async { await tester.pumpWidget(AwesomeApp()); await tester.pumpAndSettle(); await tester.enterText( find.byKey(Key('emailTextField')), 'charlie@root.me', ); await tester.pumpAndSettle(); await tester.enterText( find.byKey(Key('nameTextField')), 'Charlie', ); await tester.pumpAndSettle(); await tester.enterText( find.byKey(Key('passwordTextField')), 'ny4ncat', ); await tester.pumpAndSettle(); await tester.tap(find.byKey(Key('termsCheckbox'))); await tester.pumpAndSettle(); await tester.tap(find.byKey(Key('signUpButton'))); await tester.pumpAndSettle(); expect(find.text('Welcome, Charlie!'), findsOneWidget); });

to this:

dart
patrolTest('signs up', (PatrolIntegrationTester $) async { await $.pumpWidgetAndSettle(AwesomeApp()); await $(#emailTextField).enterText('charlie@root.me'); await $(#nameTextField).enterText('Charlie'); await $(#passwordTextField).enterText('ny4ncat'); await $(#termsCheckbox).tap(); await $(#signUpButton).tap(); await $('Welcome, Charlie!').waitUntilVisible(); });

Learn more about custom finders in the docs!

Patrol's custom finders are also available standalone in the patrol_finders
package
.

Patrol native automation

Flutter's default integration_test package can't interact with the OS your
Flutter app is running on. This makes it impossible to test many critical
business features, such as:

  • granting runtime permissions
  • signing into the app which through WebView or Google Services
  • tapping on notifications
  • much more!

Patrol's native automation feature solves these problems:

dart
void main() { patrolTest('showtime', (PatrolIntegrationTester $) async { await $.pumpWidgetAndSettle(AwesomeApp()); // prepare network conditions await $.platform.mobile.enableCellular(); await $.platform.mobile.disableWifi(); // toggle system theme await $.platform.mobile.enableDarkMode(); // handle native location permission request dialog await $.platform.mobile.selectFineLocation(); await $.platform.mobile.grantPermissionWhenInUse(); // tap on the first notification await $.platform.mobile.openNotifications(); await $.platform.mobile.tapOnNotificationByIndex(0); }); }

CLI

See packages/patrol_cli.

The CLI is needed to enable Patrol's native automation feature in integration
tests. It also makes development of integration tests much faster thanks to [Hot
Restart].

To run widget tests, you can continue to use flutter test.

Package

See packages/patrol.

CI/CD Workflows

See .github/WORKFLOWS.md for detailed documentation about all GitHub Actions workflows, including test schedules, Flutter versions, and deployment pipelines.

Patrol contracts generator

  1. (Optionally) add new request type:
dart
class OpenAppRequest { late String appId; }
  1. Add new method to NativeAutomator:
dart
abstract class NativeAutomator<IOSServer, AndroidServer, DartClient> { ... void openApp(OpenAppRequest request); ... }
  1. Run gen_from_schema script, few files will be updated

Develop patrol_cli

If you have previously activated patrol_cli run:

bash
dart pub global deactivate patrol_cli

then

bash
cd packages/patrol_cli flutter pub global activate -s path .

🛠️ Maintained by LeanCode

<div align="center"> <a href="https://leancode.co/?utm_source=github.com&utm_medium=referral&utm_campaign=patrol-readme"> <img src="https://leancodepublic.blob.core.windows.net/public/wide.png" alt="LeanCode Logo" height="100" /> </a> </div>

This package is built with 💙 by LeanCode.
We are top-tier experts focused on Flutter Enterprise solutions.

Why LeanCode?

  • Creators of Patrol – the next-gen testing framework for Flutter.

  • Production-Ready – We use this package in apps with millions of users.

  • Full-Cycle Product Development – We take your product from scratch to long-term maintenance.

<div align="center"> <br />

Need help with your Flutter project?

👉 Hire our team
  •  
Check our other packages

</div>

Contributors

Showing top 12 contributors by commit count.

View all contributors on GitHub →

This article is auto-generated from leancodepl/patrol via the GitHub API.Last fetched: 6/22/2026