Library / SDK
appium/appium-flutter-driver avatar
appium/appium-flutter-driver

Appium Flutter Driver talks to the Dart VM instead of the screen

Appium driver for Flutter apps, maintained by the community

539 stars195 forksTypeScriptMIT

At a glance

What is it?
appium-flutter-driver is an MIT-licensed Appium extension that controls Flutter apps through the Dart VM Service Protocol with the ext.flutter.driver extension, which gives it direct access to Flutter APIs rather than to the accessibility tree. It is the answer when your tests are not written in Dart, or when the app under test mixes Flutter with native views.
Who is it for?
appium-flutter-driver is a good fit for a team whose Flutter test suite is written outside Dart, that needs to drive a Flutter app embedded in a native shell or mixed with a webview, that has to run many devices at once, and that already has Appium in its toolchain.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 4 days ago.
What is it written in?
Mainly TypeScript, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 22, 2026, and from our analysis. They are not legal advice.

Editorial analysis

The mechanism: a websocket to the Dart VM

Under the hood, the driver uses the Dart VM Service Protocol with the extension ext.flutter.driver, similar to Flutter Driver, to control the application under test. That single sentence decides what this tool is and is not. It is not reading pixels or an accessibility tree, it is issuing commands inside the Flutter framework's own machinery, so it can reach elements that no screen reader would describe. The base APIs are the flutter_driver library, and the client talks to the Dart VM over the observatory URL. The README is explicit that the FLUTTER context is the mode in which commands go to the Dart VM directly over that URL, which is what allows direct interaction with Flutter elements. Everything else in this driver is layered on top of that one channel.

Why the Flutter team built its own thing first

The README concedes the starting point: Flutter comes with what it calls superb integration test support through Flutter Driver, but that does not fit some specific use cases. The four it names are worth quoting because they map exactly onto the situations where this driver earns its place. Writing tests in a language other than Dart. Running integration tests for a Flutter app that has an embedded webview or a native view, or running an existing native app with an embedded Flutter view. Running tests on multiple devices simultaneously. And running integration tests on device farms that offer Appium support, with availability depending on the vendor. If none of those four apply to you, the official tooling is simpler and the README recommends using it as a baseline wherever possible.

Three contexts, and what each one costs you

The driver has three contexts to manage the application under test and the device under test. The FLUTTER context sends commands to the Dart VM directly over the observatory URL, giving direct access to Flutter elements, but it requires the test package to import the testing tools and it means the application under test cannot be released as-is. The NATIVE_APP context is the regular Appium UiAutomator2 or XCUITest driver. The WEBVIEW context manages webview contents over UiAutomator2 or XCUITest. The trade-off is written plainly in the README, and it is the deciding factor for most teams: the FLUTTER context gives you power over the framework and costs you the ability to ship the binary you are testing. If your test target is a store release, this driver is the wrong tool.

The blackbox path, and the identifier that makes it work

The README recommends a different approach when it is available. Since Flutter 3.19, a Flutter app can expose an identifier for SemanticsProperties, which surfaces as resource-id on Android and accessibilityIdentifier on iOS, and that is enough for UiAutomator2 or XCUITest to drive the app as a blackbox without this driver at all. There is a condition attached: the appium:settings[disableIdLocatorAutocompletion] setting, or the disableIdLocatorAutocompletion value through the Settings API, has to be set so the resource-id locator works without a package name prefix like the one Android Compose uses. In other words, if your app is written with proper semanticLabel values, the OS accessibility mechanism can expose the elements on its own, and the driver becomes unnecessary. That is the recommended path when it works, and the README frames this driver as the fallback for the cases its own first section lists.

Installing the driver and wiring up the app

Version 3.0.0 of the driver requires Appium 3, and the package is ESM-only, so Appium loads it as an extension automatically while programmatic Node.js consumers have to use import or a dynamic import() rather than require(). Installation from npm is one command:

bash
appium driver install --source=npm appium-flutter-driver

and a local checkout installs as:

bash
appium driver install --source local /path/to/appium-flutter-driver/driver

The application under test has to cooperate. It must be compiled in debug or profile mode, and it must depend on the flutter_driver package with the enableFlutterDriverExtension configuration in main.dart, which in pubspec terms looks like:

yaml
# pubspec.yaml
dev_dependencies:
  flutter_driver:
    sdk: flutter

A debug or profile build and an added dependency are real costs, and they are the reason the release-build path exists as a separate recommendation.

Two Flutter drivers exist, and the difference is architectural

The README compares this driver with the Appium Flutter Integration Driver, and the difference is one line of architecture. The Flutter driver runs Flutter commands over a websocket connection against the observatory URL, calling Flutter APIs directly, with the flutter_driver library as its base API. The integration driver runs a server on the Dart VM as part of the application under test, so the Flutter APIs are called through that server, with the integration_test package as its base API. Choosing between them is a choice about how much you modify the app: embedding a server in the application under test is invasive in a different way from adding the flutter_driver dependency and the extension configuration. The repository also carries finder modules, one per client language, and each client needs the matching finder to handle element lookups.

Where this driver is the wrong tool

Three cases. The first is a Dart-only test suite, where the official integration test tooling runs on the same device with none of the extra packaging, the extra dependency and the Appium server in the middle, and the README says as much when it recommends the official tools as a baseline. The second is testing a release build for production, which the FLUTTER context rules out since the app under test cannot be released as-is when the driver is in use. The third is a team without an Appium server already, because the driver is an Appium extension, so adopting it means adopting Appium too. Against Flutter's own integration test package, the difference in approach is language and topology rather than capability, and the price of the Appium route is the server, the extra dependency and the release-build limitation. The repository also shows how small this project is: the top level holds the driver, finder, example and docs directories, the examples exist in dart, flutter_app_under_test, java, nodejs, python and ruby variants, and the published release tags in the repository listing are from 2019, while the README describes a version 3.0.0 that requires Appium 3, so the current package version and the visible tags do not line up.

Editorial conclusion

appium-flutter-driver is a good fit for a team whose Flutter test suite is written outside Dart, that needs to drive a Flutter app embedded in a native shell or mixed with a webview, that has to run many devices at once, and that already has Appium in its toolchain. It is a poor fit for a new Dart-only project, where the official integration test tooling is the simpler path, and it is a poor fit for testing a store build, because the application under test cannot be released as-is when the driver is in use. Check three things before you adopt it: that your application is compiled in debug or profile mode and imports the flutter_driver package with the enableFlutterDriverExtension configuration in main.dart, that your Appium server is version 3 if you are on driver version 3.0.0, and that the ESM-only packaging does not break your client, since programmatic Node.js consumers must use import or dynamic import() rather than require().

Frequently asked questions

How does the Appium Flutter Driver control a Flutter app?

It uses the Dart VM Service Protocol with the extension ext.flutter.driver, similar to Flutter Driver, to control the application under test. The FLUTTER context sends commands to the Dart VM directly over the observatory URL, which lets it interact with Flutter elements directly rather than through the accessibility tree.

How do I install the Appium Flutter Driver?

Run appium driver install --source=npm appium-flutter-driver, or install a local checkout with appium driver install --source local /path/to/appium-flutter-driver/driver. Version 3.0.0 of the driver requires Appium 3, and the package is ESM-only, so Node.js consumers must use import or dynamic import() rather than require().

What does my Flutter app need for this driver to work?

The application must be compiled in debug or profile mode, and it must include the flutter_driver package as a dev dependency with the enableFlutterDriverExtension configuration in main.dart. The application under test cannot be released as-is when the driver is in use.

When should I use UiAutomator2 or XCUITest instead of the Flutter driver?

The README recommends the official testing tools in Dart as a baseline, and suggests UiAutomator2 or XCUITest for release builds. Since Flutter 3.19, exposing an identifier for SemanticsProperties gives elements a resource-id on Android and accessibilityIdentifier on iOS, so blackbox automation can work without this driver, provided the disableIdLocatorAutocompletion setting is configured.

What is the difference between the Appium Flutter Driver and the Appium Flutter Integration Driver?

The Flutter driver runs Flutter commands over a websocket connection to the observatory URL and calls Flutter APIs directly, with the flutter_driver library as its base API. The integration driver instead runs a server on the Dart VM as part of the application under test and calls the APIs through that server, with the integration_test package as its base API.

Official sources

  1. appium/appium-flutter-driver on GitHub
  2. Issues
  3. License: MIT
  4. README
  5. Releases
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/appium-appium-flutter-driver.svg)](https://hysenlabs.com/projects/appium-appium-flutter-driver)

Was this useful?