Mobile testing
Maestro vs Appium vs Mobilewright: choosing a mobile test framework in 2026
Maestro vs Appium vs Mobilewright, compared from their official docs: how tests are written, iOS and Android support, setup, CI, device clouds and licenses.
Maestro vs Appium is mostly a question of how your team wants to write tests and which devices they must run on. Appium is the established option built on a standard: a server that speaks the W3C WebDriver protocol, a driver per platform, clients in Java, Python, Ruby, C# and JavaScript, and support for simulators, emulators and real devices. Maestro trades that flexibility for simplicity: tests are short YAML flows run by one CLI that treats your app as a black box, and its docs list iOS support for simulators only. Mobilewright, the newest, brings Playwright’s API to iOS and Android in TypeScript, but its first release was in March 2026 and it is still at version 0.0.67.
Every fact below comes from each project’s own documentation, checked on October 18, 2026, with Detox and the native frameworks added for context.
Maestro vs Appium vs Mobilewright: how tests are written
The quickest way to see the difference is the same sign-in test in each tool.
Appium: WebDriver clients in your language
Appium is a Node.js server. Your test is a client that sends WebDriver commands over HTTP, and a driver turns them into platform automation: the XCUITest driver converts them into calls to Apple’s XCUITest library, and the UiAutomator2 or Espresso driver does the same on Android. The Appium team maintains clients for Java, Python, Ruby and C#, and its quickstart recommends WebdriverIO for JavaScript and TypeScript.
import { remote } from 'webdriverio';
const driver = await remote({
hostname: 'localhost',
port: 4723,
capabilities: {
platformName: 'Android',
'appium:automationName': 'UiAutomator2',
'appium:appPackage': 'com.example.shop',
'appium:appActivity': '.MainActivity',
},
});
try {
await driver.$('~email').setValue('user@example.com');
await driver.$('~password').setValue('password123');
await driver.$('~sign_in').click();
await driver.$('~welcome_banner').waitForDisplayed();
} finally {
await driver.deleteSession();
}
The ~ selector is an accessibility id: the accessibility identifier on iOS and the content description on Android, so one test can drive both apps if they share ids. Appium 3 came out in August 2025 with small breaking changes, mainly a newer minimum Node.js and removed deprecated endpoints.
Maestro: YAML flows
Maestro tests, called flows, are YAML files that read like instructions. The open-source CLI drives the device from outside the app through a small companion driver app, so you add nothing to your build.
appId: com.example.shop
---
- launchApp
- tapOn:
id: 'email'
- inputText: 'user@example.com'
- tapOn:
id: 'password'
- inputText: 'password123'
- tapOn: 'Sign in'
- assertVisible: 'Welcome back'
Run it with maestro test signin.yaml, or maestro test -c to rerun it every time you save. When YAML is not enough, a flow can run JavaScript in a restricted environment without access to the local file system. Maestro Studio, a desktop app, builds flows as you click elements on a mirrored device screen.
Mobilewright: Playwright’s API on a phone
Mobilewright comes from Mobile Next, the makers of Mobile MCP, and runs on their mobilecli tool. Its @mobilewright/test package extends Playwright Test with screen and device fixtures, so locators, expect, reporters, workers and retries follow Playwright Test.
import { test, expect } from '@mobilewright/test';
test('can sign in', async ({ screen }) => {
await screen.getByLabel('Email').fill('user@example.com');
await screen.getByLabel('Password').fill('password123');
await screen.getByRole('button', { name: 'Sign In' }).tap();
await expect(screen.getByText('Welcome back')).toBeVisible();
});
getByRole maps roles to each platform’s native element types. A team that already writes Playwright tests (see agentic testing with Playwright) will recognize every line.
| Tool | Tests are | Languages |
|---|---|---|
| Appium | Client code sending WebDriver commands | Java, Python, Ruby, C#, JavaScript and more |
| Maestro | YAML flows, with optional JavaScript | YAML |
| Mobilewright | Playwright style test files | TypeScript or JavaScript |
Platforms and devices
| Tool | iOS | Android |
|---|---|---|
| Appium | Simulators and real devices | Emulators and real devices |
| Maestro | Simulators | Emulators and physical devices |
| Mobilewright | Simulators and real devices | Emulators and real devices |
If you must test on physical iOS devices, that settles the Maestro vs Appium question first: Maestro’s docs list only simulators for iOS.
Real iOS devices take work in Appium: the XCUITest driver installs a helper app (WebDriverAgent) that needs a valid provisioning profile, and the device needs Developer Mode and the Enable UI Automation setting turned on. Appium also reaches beyond phones: Apple TV, Apple Watch simulators (since September 2026), Android TV, Wear, XR and Automotive, plus macOS, Windows and desktop browsers.
| Tool | React Native | Flutter |
|---|---|---|
| Appium | No dedicated driver | Two drivers outside the official set |
| Maestro | Supported, including Expo Go and EAS builds | Supported through the semantics tree |
| Mobilewright | Supported on iOS and Android | Since version 0.0.60, debug builds only |
Appium has no React Native driver; its XCUITest driver docs simply note that a React Native testID becomes the element’s name. Maestro does not yet support Flutter desktop apps, and it describes its web support as functional with ongoing development.
Setup effort
| Tool | You install | For iOS you need |
|---|---|---|
| Appium | Node.js, the server, a driver per platform, a client | macOS with Xcode |
| Maestro | Java 17 or newer and one CLI | macOS with Xcode |
| Mobilewright | Node.js 22.12 or newer and two npm packages | macOS 13 or newer with Xcode |
- Appium has the most moving parts: the server (
npm install -g appium), a driver per platform (appium driver install uiautomator2), and each platform’s toolchain, meaning the Android SDK and a JDK, or Xcode. Each official driver ships a doctor command, such asappium driver doctor xcuitest. - Maestro installs with curl, Homebrew or a zip on Windows. It expects your app to be installed on the device already, and
maestro start-devicecreates an emulator or simulator for you. - Mobilewright scaffolds a project with
npm init mobilewright@latest, andnpx mobilewright doctorchecks Xcode, the Android SDK and devices. Android needs JDK 11 or newer, and on Linux Android tests run through its Docker image. It does not boot a simulator or emulator for you.
Waiting and flakiness: what each tool documents
We leave speed out, because vendor speed claims are not benchmarks we could check, and compare how each tool waits for the app instead.
- Appium: the drivers wait for the app to go idle before acting. UiAutomator2 waits for the accessibility event stream (the
waitForIdleTimeoutsetting, 10 seconds by default), and the XCUITest driver waits for the app’s main thread, also 10 seconds by default. Waiting for a specific element is up to your test, for examplewaitForDisplayed()in WebdriverIO. - Maestro: assertions poll the screen until the element appears or a timeout passes.
extendedWaitUntilcovers slow operations,waitForAnimationToEndwaits for movement to stop, andretryTapIfNoChangeretries a tap when the screen does not change.clearStateresets app data before launch, and Maestro Cloud wipes and recreates each virtual device between tests. - Mobilewright: before every action it checks that the element exists, is visible, is enabled and has stable bounds, retrying every 100 ms up to a default timeout of 5 seconds. Assertions retry the same way, and the config has a
retriesoption.
Retries are a safety net, not a fix. A test that passes only on the second attempt still needs its cause found, just like a flaky web test (see flaky tests in Playwright).
CI and device clouds
| Tool | In CI | Device clouds |
|---|---|---|
| Appium | Start the server in your pipeline | BrowserStack, LambdaTest |
| Maestro | maestro test, or Maestro Cloud integrations |
Maestro Cloud |
| Mobilewright | Documented GitHub Actions setup | Mobile Next Cloud, BrowserStack |
For iOS, plan on macOS runners with any of the three.
- Appium is a plain server, so any CI that can start it and reach a device works, and its docs include a guide to Selenium Grid. The Appium blog describes BrowserStack’s and LambdaTest’s clouds as supporting Appium; both, with Sauce Labs, fund the project as strategic partners.
- Maestro can split a suite across several local devices with
--shard-split. Maestro Cloud runs flows in parallel on hosted virtual devices, with integrations for GitHub Actions, Bitrise, Bitbucket Pipelines and CircleCI, and it can block a GitHub pull request when tests fail. - Mobilewright supports parallel workers, sharding and merging the reports of sharded CI runs. Its documented clouds are Mobile Next Cloud from the same team, BrowserStack App Automate through
@browserstack/mobilewright, and one more provider through@testingbot/mobilewright-driver.
License, maturity and lock-in
| Tool | License | Version on October 18, 2026 |
|---|---|---|
| Appium | Apache 2.0 | 3.8.0, with Appium 4 in beta |
| Maestro | Apache 2.0 (the CLI) | CLI 2.11.0 |
| Mobilewright | Apache 2.0 | 0.0.67 |
| Detox | MIT | 20.51.3 |
All are open source, and Maestro and Mobilewright each have a hosted cloud from the same company. Mobilewright is the one to check carefully: its first npm release was on March 24, 2026, it shipped eight releases in the four weeks to October 18, 2026, and its public roadmap still lists push notifications, biometrics, network interception, device logs and tracing as planned. It also collects anonymous usage telemetry by default; set MOBILEWRIGHT_DISABLE_TELEMETRY=1 or DO_NOT_TRACK=1 to turn it off.
The tests never lock you in, since they are files in your repository. They do not translate into each other, though: moving from YAML flows to TypeScript, or from Appium’s Java client to Maestro, means rewriting the suite. Choose for the next few years, not the next sprint.
Detox and the native frameworks, for context
Detox
If you are weighing Maestro vs Appium vs Detox, start from what Detox is built for: React Native apps. It is a gray box framework from Wix: tests are JavaScript, with Jest integration out of the box, and Detox monitors network requests, timers, animations and the React Native threads, then waits for them to finish before the next step. Its site says real devices are not yet supported on iOS. Choose it when React Native developers will own the tests; choose Maestro for black box flows.
Espresso and XCTest
Google’s Espresso (Kotlin or Java) and Apple’s XCTest with the XCUIAutomation framework live inside each app project. Espresso waits until the message queue has nothing it must process, no AsyncTask is running and your idling resources are idle, and Android’s docs aim it at developers who know the codebase. Xcode can record your interactions and write the element queries for you. Appium builds on both: its XCUITest driver runs on XCTest, and it has an Espresso driver.
How to choose by situation
There is no best mobile testing framework in general, only the best fit for one app and one team. Here is how the documented facts map to common situations:
- You must test on physical iOS devices: Appium or Mobilewright.
- Your test authors write Java, Python, Ruby or C#: Appium, the only one of the three with clients in those languages.
- People who do not write code should read and review the tests: Maestro, whose flows are human-readable YAML that Maestro Studio can build by clicking.
- Your web tests are Playwright and TypeScript: Mobilewright vs Appium then comes down to familiarity against maturity. Mobilewright wins on familiarity; check its roadmap for every device feature your flows need.
- A hybrid app built on web views (Cordova, Capacitor, Ionic): Mobilewright gives you a Playwright page inside the web view; Appium’s main drivers also have hybrid and web modes.
- A Flutter app: Maestro, or Mobilewright with a debug build. Appium needs a driver from outside the official set.
- TV, watch or desktop apps as well as phones: Appium, the only one of the three whose docs cover them.
- One platform, with developers who own their UI tests: Espresso or XCTest, at the cost of a separate suite per platform.
Whatever you pick, start with the few flows that would hurt most if they broke, as in risk-based testing. A mobile test automation framework is easier to judge on ten real tests than on a feature list.
How we pick a framework for your app
We do not have a house framework. For each app we answer the questions above: which platforms and devices matter, what the app is built with, who on your team will read the tests, and which CI and device cloud you already use. Then we choose Appium, Maestro or Mobilewright with you in the first week. The tests are plain code in your repository and run in your CI on every pull request. Claude agents write and maintain them, a QA engineer reviews every change before it is merged, and a person looks at every failure before it becomes a bug report or a test fix. The mobile app testing page covers the mobile side, and how it works shows a week of the service.
Sources
All checked on October 18, 2026.
- How Does Appium Work?, Appium documentation
- Appium 3, Appium blog
- Appium drivers and Appium clients, Appium documentation
- System requirements and Write a test in JavaScript, Appium documentation
- XCUITest driver requirements, device preparation and element attributes, Appium XCUITest driver documentation
- UiAutomator2 driver, Appium on GitHub
- Appium blog, with the strategic partner posts for BrowserStack, Sauce Labs and LambdaTest, and Apple Watch simulator support
- Appium releases, GitHub
- Selectors, WebdriverIO documentation
- Supported platforms, How Maestro works and Install the Maestro CLI, Maestro documentation
- Wait commands, Specify and start devices and Maestro Cloud, Maestro documentation
- React Native and Flutter, Maestro documentation
- Maestro releases, GitHub
- Mobilewright installation, Automatic waiting, Setting up CI and Cloud providers, Mobilewright documentation
- Mobilewright README and roadmap, GitHub
- Detox and How Detox works, Detox documentation
- Detox releases, GitHub
- Espresso, Android Developers
- XCUIAutomation and Recording UI automation for testing, Apple Developer Documentation
Researched and drafted with Claude, Anthropic's AI model, and checked against the sources it links. Spotted an error? Tell us and we will correct it.