Platform · QA Automation

Write a test in plain English.
Get real Playwright code.

Testwright is the QA-automation world inside AIRaML — a full workspace, not a single tool. Describe a test in plain English and it writes runnable Playwright TypeScript; then run it on isolated CI with video and a trace, discover new cases from a page, and heal a break across the whole suite. Free and open-source.

Free to runPlaywright · TypeScriptRuns & self-healsAny public site

You describe

Open the home page.

Click the link to the tools section.

Check the tools heading is visible.

Search "anomaly" and expect a result card.

Testwright writes

import { test, expect } from '@playwright/test';

test('tools search', async ({ page }) => {
  // role/name, not a brittle CSS path
  await page.goto(BASE_URL);
  await page.getByRole('link',
    { name: 'Tools' }).click();
  await expect(page.getByRole('heading',
    { name: 'Tools' })).toBeVisible();
  await page.getByPlaceholder('Search')
    .fill('anomaly');
  await expect(page.getByTestId('tool-card'))
    .toHaveCount(1);
});

A real generation, shown as an example. It writes the draft; run it on isolated CI and, if a locator breaks, self-heal it — all here.

One workspace, four stages

The QA lifecycle, end to end

One world made of stages that hand off to each other — author a test, run it on isolated CI, discover new cases from a page, and heal a break across the whole suite. All four stages are live today.

AuthorRunDiscoverHealeach stage feeds the next — one workspace, one record

How it works

Describe → generate → run → heal

01

Describe or discover

Type the steps in plain English, paste a written test case, or let Discover render a page and propose test cases for you.

02

Generate the test

A free LLM (Cohere → Mistral, budget-capped) returns one runnable Playwright TypeScript file — role/text/label locators, real assertions, a comment on each choice.

03

Run, then heal

Execute on an isolated CI runner for pass/fail with video and a full trace. If a locator breaks, self-healing re-resolves it from the page and re-runs.

Scope

What it does, and what it doesn't

The full authoring-to-healing loop, free and running real browsers on isolated CI. Here is what is in scope and what is out — stated plainly.

In scopeWhat Testwright does

  • Plain-English or imported description → Playwright TypeScript
  • Resilient role / text / accessible-name locators, with real assertions
  • Execute on isolated CI (GitHub Actions): screenshots, video, trace, step timeline
  • AI self-healing — re-resolve a broken locator from the page and re-run
  • Discover — render a URL, read its structure, and propose test cases
  • Saved tests and run history with a pass-rate, all in the browser

Out of scopeWhat it doesn't do

  • Native mobile, desktop or mainframe apps
  • Email deliverability, SMS or phone-call flows
  • Massive parallel browser / OS / device matrices (one free runner at a time)
  • Private or internal (non-public) addresses
  • Instant results — a run queues and spins up a runner, so expect about a minute

The whole loop, in one workspace.

Author, Run, Discover and Heal are all live — plain English to a passing, self-healing test, free and on real browsers.