Skip to content

Playwright-style mobile testing for Android and iOS

New in 0.7: composable locators and per-session agent tokens

Playwright-style tests for real Android and iOS apps.

Astur drives your app through native agents, UIAutomator on Android and XCUITest on iOS, with no Appium server in between. Native, React Native and Flutter apps, on emulators, simulators and real devices.

npm create astur@latest
An astrolabe whose star pointers mark Android, iOS, Flutter, React Native and WebView 0306090120150180210240270300330 Android iOS Flutter React Native WebView

One test, from your editor to the device.

You write the spec with the Playwright Test API you already know. Astur carries it the rest of the way.

  1. Your specPlaywright Test: fixtures, projects, retries, the HTML report, the VS Code play button.
  2. The Astur runtimeAuto-waiting actions, retrying assertions, screenshots and video on failure.
  3. A native agentUIAutomator on Android, XCUITest on iOS. No Appium server, no WebDriver bridge.
  4. The deviceAn emulator, a simulator, or the phone on your desk.
tests/sign-in.spec.ts
import { test, expect } from '@astur-mobile/test';

test('sign in', async ({ device }) => {
  await device.getByLabel('Email').fill('qa@example.com');
  await device.getByRole('button', { name: 'Sign in' }).tap();
  await expect(device.getByText('Welcome')).toBeVisible();
});

Works with whatever your app is built in.

  • AndroidEmulators and real devices, through a UIAutomator agent.
  • iOSSimulators and real devices, through an XCUITest agent.
  • React Native and ExpotestID and accessibility labels, read natively.
  • FlutterThe live widget tree on Android; the accessibility tree on iOS.
  • Compose and SwiftUIAnything that renders native views, including .NET MAUI.
  • WebViews and mobile webReal DOM control inside the app, and Chrome or Safari on the device.

Everything a mobile suite needs, in one package.

Inspector and codegen
Mirror the device, browse the live tree, and record taps into a spec you keep.
Composable locators
getByRole, filter, and/or, nth: pin the one row you mean in a list of look-alikes.
Assertions you can trust
They wait for the condition and fail when the device cannot be read. A lost action is never repeated.
Network observation
Assert on the HTTP calls your app makes, not only on what it renders.
Visual comparison
toHaveScreenshot with per-device baselines and masked regions.
Secure by default
Every agent and the inspector require a per-session token.

See it run.

Inspection, authoring and a cross-platform run, in one short walkthrough.

Named after an instrument you could hold.

The astrolabe was an analog computer small enough to carry: turn the rete, sight a star along the alidade, and read the answer off the limb. In tenth-century Aleppo, Mariam al-Asturlabiya was known for building them.

Astur is the same idea for mobile testing: a small native runtime you can hold in one test, in place of a server stack.

Your first test is one command away.

The scaffolder asks what you target and writes a working config and a first test.

npm create astur@latest