Skip to main content
Taqwright logo
Taqwright
Public beta is now live

A mobile UI test automation suite that doesn't need babysitting.

Cross-platform iOS & Android testing on the Playwright runner, with a flat mobile locator API on top of Appium 3. Write tests yourself, or let AI agents generate and drive them.

npm install --save-dev @taqwright/taqwright@beta

Run and view your first test in 3 minutes

Setting up Appium usually means Java, the Android SDK, emulators, and hours of config before you write a single test. Taqwright does it in one command.

npx taqwright init

One command scaffolds a sample project with 3 ready-made tests on a demo app. Java, the Android SDK, and emulators download and configure automatically. Under a minute, with zero manual setup.

Taqwright SDK

Playwright-style API with auto-waiting, chainable locators, and retrying assertions. Drives native iOS & Android: UIKit, SwiftUI, Jetpack Compose, React Native, and Expo.

await mobile.getByLabel('Username').fill('emma@demoapp.com');
await mobile.getByLabel('Password').fill('10203040');
await mobile.getByLabel('Login').click();
await expect(mobile.getByLabel('View All')).toBeVisible();

Taqwright CLI

Zero-config setup that auto-discovers emulators & simulators. Scaffold, run tests, and verify your environment from the command line.

$ npx taqwright init
$ npx taqwright doctor
$ npx taqwright codegen
$ npx taqwright test
$ npx taqwright show-report

Record a test by tapping your app

Codegen opens an inspector against a real device. You drive the app, and Taqwright writes the spec for you, picking a stable locator for every element you touch.

npx taqwright codegen

Codegen ranks locators against the live screen and emits a runnable @taqwright/taqwright spec. Drop it under tests/ and run it as-is. Read the codegen guide →

iOS & Android. One API. Real devices.

Any device, one API

Run the same tests across iOS and Android, on emulators, simulators, and real devices. A single flat mobile fixture drives them all.

Playwright runner, Appium engine

The Playwright test runner, reporters, and fixtures you know, driving Appium 3 (uiautomator2 & xcuitest), auto-started for you.

Cloud & parallel ready

Fan out across a local device pool, or run unchanged on BrowserStack and LambdaTest. Each worker gets its own isolated session.

Test the apps you build

Native, cross-platform, and hybrid apps on iOS & Android. If it renders to native components, Taqwright can drive it.

Apple
iOS
Swift
Swift / SwiftUI
Android
Android
Jetpack Compose
Jetpack Compose
React
React Native
Expo
Expo
Flutter
Flutter
Ionic
Ionic

Why Taqwright

Combining the power of Playwright and Appium to drive the device like a real user, with the tooling to prove it.

Complex gestures, first-class

Swipe in and out, pinch to zoom, scroll within a precise region, and drag & drop between elements, plus fully custom, multi-pointer W3C gestures when you need them. Every gesture auto-waits for the target, so flows stay reliable.

See the gesture API
gestures.spec.ts
// Swipe inside a carousel, list, or any element
await mobile.getById('carousel').swipeLeft();

// Pinch to zoom a map or photo
await mobile.getById('map').pinchOut();
await mobile.getById('map').pinchIn();

// Region-scoped, controlled scrolling
await mobile.scroll('down', { from: { y: 0.7 }, to: { y: 0.3 } });
await mobile.getByText('Accept').scrollIntoView();

// Drag and drop
await mobile
.getByText('Ship the release')
.dragTo(mobile.getById('column-done'));

// Custom multi-finger gesture
await mobile.gesture({ pointers });

Everything you need to test mobile, reliably

Auto-wait, no flaky tests

Actions wait for elements to be actionable and expect auto-retries until it passes or times out. No hard-coded sleeps, no race conditions.

Ranked, resilient locators

getById, getByRole, getByLabel, getByText, plus filter, nth, and chaining to pin down exactly the element you mean.

Inspector & codegen

A browser-based inspector mirrors the live device, ranks every locator by stability and uniqueness, and records your interactions into a runnable spec.

Trace & video debugging

Capture a per-action screenshot + page-source timeline as a self-contained trace.html, and screen recordings on failure, straight into the HTML report.

Parallel across a device pool

Declare a pool of devices, bump workers, and each worker gets its own isolated Appium server and device. No port collisions, no double-booking.

Run on real cloud devices

The same specs run unchanged on BrowserStack and LambdaTest: flip the project's provider, export credentials, and ship.

Generate tests from English

Describe a goal in plain language and lime-cli's QA agent drives a real device, returning a runnable Taqwright spec.

Full app lifecycle control

Install, launch, reset, background, and deep-link your app. Set resetBetweenTests for a clean install before every test.

Familiar Playwright API

The same test, expect, fixtures, reporters, and locator model you know from Playwright, now for native mobile.

Resilient • No flaky tests

Locators auto-wait for elements to be actionable before acting, and expect assertions retry until they pass. No more hard-coded sleeps.

Prefer stable locators like getById, getByRole, and getByLabel, ranked for you by the built-in inspector.

Learn more
drag-and-drop.spec.ts
import { test, expect } from '@taqwright/taqwright';

test('drag a card into the Done column', async ({ mobile }) => {
const card = mobile.getByText('Ship the release');
const doneColumn = mobile.getById('column-done');

// press-and-hold to pick the card up, then drop it on the target
await card.dragTo(doneColumn, { duration: 600 });

// it now lives under the Done column
await expect(doneColumn.locator(card)).toBeVisible();
});