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 test
$ npx taqwright show-report
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.
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// 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 });
Inspector & codegen
A live device inspector that ranks locators by stability, and codegen that records your flow into a runnable spec.
Trace, video & network
A per-action screenshot timeline, screen recordings, and HAR network logs on failure, all in the HTML report.
Parallel & cloud
Fan out across a local device pool, or run the same specs on BrowserStack and LambdaTest, unchanged.
AI test generation
Describe a goal in plain English and an agent drives a real device, returning a runnable Taqwright spec.
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.
import { test, expect } from '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();
});
