AI test automation tool for macOS and Windows
Retracio turns your manual web testing into E2E tests that follow your conventions
For QA engineers and developers who own E2E. Record a manual run in the desktop app and get a plain Playwright spec in TypeScript or JavaScript, written into your repository.
- Open /cartrole
- Click Add to cartrole
- Fill Promo codelabel
- Click Applytest-id
- Check total equals sumtest-id
- Check heading Order summaryrole
import { test, expect } from '@/fixtures';import { CartPage } from '@/pages/cart'; test('applies promo code and shows total', async ({ cartWithItems }) => { const cart = new CartPage(cartWithItems); await cart.goto(); await cart.addToCart.click(); await cart.promoCode.fill('SPRING'); await cart.apply.click(); // checks marked during the recorded run await expect(cart.total).toHaveText(await cart.sumOfLines()); await expect(cart.heading).toBeVisible();});
Why the test automation backlog keeps growing
Manual testing does not scale with the product
Before every release someone walks through the same login, checkout and search scenarios by hand. The scenario count grows with each shipped feature, while the hours in a sprint stay fixed. Scenarios that nobody had time to automate stay manual, and that test automation backlog is where regressions wait until a customer reports them.
Generated tests do not pass code review
Recorded and AI-generated tests arrive with inline CSS paths, hard-coded waits and their own naming, while the repository already has page objects, fixtures and a lint config. A reviewer either rewrites the file to match or merges code the team will not maintain. The generator saved recording time and moved the same work into review.
E2E test maintenance eats the team's time
UI tests break when the UI changes: a renamed button, a moved form or a new loading state fails a locator that pointed at a div path. In a published study of record-and-replay suites, 73% (source) of breakages were caused by locators. A recorded test rots as soon as the screen it captured moves on, and a self-healing run that rewrites the locator without a review leaves nobody sure what the test checks now.
How does AI test generation work here?
Four steps take a scenario you already test by hand and generate E2E tests from that manual testing, ending with a Playwright spec that runs in your pipeline.
Step 1: Run the test by hand
- You open Retracio, start a session and walk through the scenario in the browser: navigate, click, type, and mark what should be true on each screen.
- The app records each action with the element it resolved and the checks you marked, preferring role, label and test-id locators over generated CSS paths.
- Result: a recorded run stored on your machine, with stable locators and explicit expectations.
- Open /products
- Click “Add to cart”
- Heading “Your cart” is visible
- Fill “Email”
- Click “Checkout”
- Row “Order summary” appeared
- Total equals the sum
Step 2: Point the app at the repository
- You select the project checkout and the E2E test folder.
- The app scans the repository for framework, page objects, fixtures, naming and assertion style, then sends the recorded steps, trimmed DOM snapshots and excerpts of that profile to the LLM through your API key; source code never leaves the machine.
- Result: a draft test in the repository's style, beside similar tests, reusing existing page objects and fixtures.
- src/
- tests/e2e/
- login.spec.ts
- search.spec.ts
- pages/
- fixtures/
- framework
- Playwright · TypeScript
- page objects
- pages/CartPage.ts, pages/CheckoutPage.ts
- fixtures
- fixtures/auth.ts
- naming
- kebab-case · *.spec.ts
- lint
- eslint · prettier
Step 3: Review the generated test
- You read the draft as a diff, adjust a name or an assertion, and run it locally.
- The app runs the test with Playwright against the same application, shows pass or fail per step, and regenerates only the failing step when asked, leaving the rest untouched.
- Result: a passing spec file that reads as if the team wrote it and passes code review without a rewrite.
import { test, expect } from "../fixtures/test";
import { CartPage } from "../pages/CartPage";
test.describe("checkout", () => {
test("adds an item and updates the cart total", async ({ page, signedIn }) => {
const cart = new CartPage(page);
await page.goto("/catalog");
await page.getByRole("button", { name: "Add to cart" }).first().click();
await page.getByRole("link", { name: "Cart" }).click();
await expect(page.getByRole("heading", { name: "Your cart" })).toBeVisible();
await expect(cart.row("Standing desk")).toBeVisible();
await page.getByLabel("Quantity").fill("2");
await expect(page.getByTestId("cart-total")).toHaveText(await cart.sumOfRows());
});
});
Step 4: Commit and run in CI
- You commit the file to a branch and open a pull request as usual.
- The app stays out of the way: the test is plain Playwright with no Retracio runtime, plugin or dependency. If the repository has no E2E job, it offers a snippet for GitHub Actions or GitLab CI.
- Result: the test runs in the existing pipeline; the manual scenario now runs on every push.
- branch
- test/checkout-flow
- file
- tests/e2e/checkout.spec.ts
- message
- Add checkout flow test
# .github/workflows/e2e.yml
runs-on: ubuntu-latest
steps:
- run: npx playwright install --with-deps
- run: npx playwright test
How to review AI generated tests without rewriting them
Generated tests usually fail code review for reasons unrelated to whether they pass: selectors inline, no fixtures, wrong folder. Retracio scans the local checkout before it writes anything and builds a conventions profile from what is already there.
Structure. The scan finds where E2E tests live and how files are named. The generated spec goes next to similar tests under the same name pattern.
Locators. Existing tests show which locator style the team accepts: roles, labels, test ids, or a data-testid prefix. Every element from the manual run is resolved to that style, with CSS or XPath only when nothing else matches.
Fixtures. Custom test fixtures for login, seeded data, or an authenticated page are detected and reused, so the generated test starts from the same setup as the rest of the suite.
Page objects. When the repo already has a page object for a screen the tester walked through, the test imports it. A new one appears only for a screen the repo has never covered, in the same shape as the existing ones.
Style. Assertion style, lint and formatter config, and custom helpers are read from the repo. The output passes the same checks as tests the team wrote by hand, and every check the tester marked during the run becomes an explicit expect on an outcome.
Below is the same checkout scenario written without the conventions profile and with it. Both files are illustrations and carry the example output label.
import { test } from '@playwright/test';
test('test 1', async ({ page }) => {
await page.goto('http://localhost:3000/login');
await page.fill('#email', 'user@example.com');
await page.fill('input[type="password"]', 'secret');
await page.click('#btn-3');
await page.waitForTimeout(3000);
await page.click('//div[@class="cart-row"][1]/button');
await page.waitForTimeout(2000);
await page.click('.checkout-footer > button.primary');
await page.waitForTimeout(3000);
await page.click('#btn-7');
});
import { test, expect } from '../fixtures';
import { CartPage } from '../pages/CartPage';
import { CheckoutPage } from '../pages/CheckoutPage';
test.describe('checkout', () => {
test('places an order from the cart', async ({ authedPage }) => {
const cart = new CartPage(authedPage);
await cart.goto();
await cart.removeItem('Blue hoodie');
await expect(cart.total).toHaveText('$24.00');
await cart.proceedToCheckout();
const checkout = new CheckoutPage(authedPage);
await checkout.placeOrder();
await expect(authedPage.getByRole('heading', { name: 'Order confirmed' })).toBeVisible();
await expect(authedPage.getByTestId('app-order-number')).toBeVisible();
});
});
What happens between the manual run and the merged test
Eight things the desktop app does so that AI generated Playwright tests arrive in review looking like the rest of the suite.
Follow the repository's conventions
Before writing a line, Retracio reads how existing tests are structured, named, and asserted and builds a conventions profile from them. The generated test lands in the same folder pattern, uses the same fixtures and helpers, and passes the same lint and formatter config.
Reuse the page objects already in the repo
When the repository has a page object or helper for the screen the tester walked through, the generated test imports it instead of duplicating selectors inline. New page objects appear only for screens the repo has never covered, shaped like the existing ones.
Pick locators that survive a redesign
Every element the tester touched is resolved to a role, label, or test-id locator, with CSS or XPath used only when nothing better exists. If the repo has its own locator convention, such as a data-testid prefix, the generated test follows it.
Turn marked checks into assertions
During the manual run the tester marks what should be true on each screen, and each mark becomes an assertion in the generated test. The output verifies outcomes on every screen, so a green run means the scenario worked.
Run everything on your machine
The browser, the recording, the repository scan, and the test execution all happen locally inside the desktop app. Recorded steps, trimmed DOM snapshots, and excerpts of the conventions profile go to the LLM through your own API key; source code, cookies, and credentials stay local.
Keep code you own
The output is a plain Playwright spec with no Retracio import, plugin, or runtime, so it runs in your CI exactly like the tests you wrote by hand. Uninstall the app tomorrow and every generated test keeps working.
Regenerate a single failing step
When a step fails on review, only that step is regenerated and the rest of the file stays untouched, including edits the tester already made. The diff on the review screen shows exactly what changed and nothing else.
Bring your own model key
The LLM is called through an API key you provide, so there is no per-test pricing and no vendor-side store of your sessions. Model cost is visible per generated test on the review screen and stays with the provider you already use.
What it works with
Retracio writes Playwright tests in TypeScript or JavaScript today, with Cypress and WebdriverIO planned. The app runs on macOS and Windows. Generated tests run in GitHub Actions and GitLab CI like any other file in your repository.
| Frameworks | Playwright; Cypress (planned), WebdriverIO (planned) |
|---|---|
| Languages | TypeScript, JavaScript; Python (planned), Java (planned) |
| Platforms | macOS, Windows |
| CI | GitHub Actions, GitLab CI; Jenkins (planned), Azure Pipelines (planned), CircleCI (planned) |
Record and playback vs AI test generation
Four approaches produce E2E tests today: record-and-playback recorders, cloud AI platforms, copilots inside the IDE, and a desktop app that reads your repository before writing a test. Retracio is the last one. The table compares them by whether a capability is documented, with each cell linking to the vendor's own page.
Alternatives checked on 2026-09-08 against their own websites and documentation. Empty cell: not confirmed.
Full comparisons of Retracio against each alternative, grouped by type, are on the compare page.
What the measurements show
Every number below carries the condition it was measured under, the sample size and the year. Nothing here is a projection.
14
68%
91%
74%
88%
5
Your repository is not the reference repository. A codebase with competing fixture styles or without page objects gives the conventions and reuse figures less to work with, and the first batch of tests will show it.
What beta users say after the generated tests reached review
These quotes come from beta users of the desktop app, anonymized at their request. Each one describes what happened in their own repository during the beta.
“The first spec Retracio produced imported our existing LoginPage object and the authedPage fixture we wrote two years ago. I opened it expecting to rewrite the whole thing and ended up renaming one variable.”
“Recording the checkout scenario took me twelve minutes, which is about what a manual pass takes anyway. The pull request was open before standup.”
“The redesign renamed half of our CSS classes. The tests Retracio generated were the only ones in the suite that did not move, because everything in them sits on roles and test ids.”
“I review every E2E test that lands in our repo. For the first month I could not tell which ones were generated until I looked at the commit message.”
“Security signed off in a week. Nothing but recorded steps and trimmed DOM snippets leave the laptop, and the model calls go through our own API key, so there was no new vendor to assess.”
“After the trial I asked what happens if we stop paying. The answer was nothing: the tests are plain Playwright in our repository with no import from Retracio. That is the reason we stayed.”
“One step broke because the date picker changed. Regenerating that step touched four lines and left the assertions I had edited by hand exactly as they were.”
“It is not magic. Our repo had three competing fixture styles, and the first batch of tests picked the wrong one. We cleaned up the fixtures, and the second batch was noticeably better. That is fair: it can only follow conventions that exist.”
“Two of our manual testers now ship automated tests without writing code, and the developers approve them in review. The checks they mark during the run become real assertions, not a list of clicks.”
“The CI snippet worked on the first push. Our GitLab pipeline picked the test up next to the unit tests, and I had a green check about twenty minutes after I finished recording.”
Where the app runs and what leaves your machine
Retracio is a desktop app with a hybrid execution model: the recording, the repository scan, and the file writes happen on your machine, and test generation calls an LLM provider over the network.
What leaves the machine. Recorded steps, trimmed DOM snapshots of the pages under test, and excerpts of the repository's test conventions (page objects, fixtures, naming) are sent to the LLM provider for generation.
What stays on the machine. Source code, generated tests, browser sessions and cookies, screenshots and recordings, and credentials remain local.
How the repository is handled. The app reads the local checkout only. It never clones or uploads the repository. Generated tests are written as files into the folder you choose, and committing stays with you.
LLM provider. Generation runs on Anthropic Claude through your own API key (BYOK). The key stays yours.
Ownership. The output is plain test files in the folder you chose, inside your repository.
Free while the beta runs
Retracio is a desktop app for macOS and Windows, free to use for as long as the beta runs. Builds go out to people on the waitlist rather than from a public download page. Test generation goes through Anthropic Claude with your own API key, so model usage is billed by Anthropic to your account; nothing is billed by us.
Your work email, your framework, the size of your team. The entry reaches us as an email, and what happens to it is written in the privacy policy.
Frequently asked questions
Do AI generated tests follow our team's coding standards?
They do when the generator takes the standards from the repository instead of from a prompt. Before writing a line, the app scans the local checkout and builds a conventions profile: folder structure, file and test naming, assertion style, lint and formatter config, existing fixtures, helpers and page objects. The generated spec is placed next to similar tests, imports the fixtures and page objects that already exist, and passes the same lint and formatter checks as the tests your team wrote by hand.
Do AI generated tests break when the UI changes?
A test breaks when the elements it depends on change, so the choice of locators decides how often that happens. Every element the tester touched during the manual run is resolved to a role, label, or test-id locator, with CSS or XPath as a fallback only when nothing better exists. If the repository has a data-testid prefix convention, the output follows it. When a redesign still breaks a step, you regenerate that step on the review screen and the rest of the file stays as it was.
How does AI testing handle flaky tests?
Flakiness usually comes from timing and from locators tied to markup. During recording the app notes where the page waited on network or animation and stores that with the step. Locators are chosen by role, label, or test id instead of generated CSS paths. Before you commit, the draft executes locally with Playwright against the same application and shows pass or fail per step, so a step that does not hold up is visible before it reaches CI. A failing step can be regenerated on its own.
Who owns AI generated test code?
You do. The output is a plain Playwright spec file written into a folder you choose inside your own repository. It carries no import, plugin, or runtime from Retracio, and no dependency outside the package.json the repository already has. Committing, reviewing and executing the file stay with your team, the same as for a test written by hand. Remove the app tomorrow and every generated test keeps running in CI as before.
Does Retracio work offline?
Partly. Recording the manual run, scanning the repository, writing files, and executing the generated test with Playwright all happen locally inside the desktop app and need no server. Generating the draft test calls Anthropic Claude through your own API key, and that step needs a network connection. There is no vendor server in between: the outbound calls of a session go only to the configured LLM provider endpoint, and the app is free during the beta.
How does AI test generation differ from record and playback?
Record and playback turns clicks into a script. Playwright codegen, for example, writes the recorded actions into a new spec file, picks locators by looking at the page, and its documentation leaves further improvement of that file to the user. (checked 2026-09-08) Generation from a manual run adds two inputs: the checks the tester marked on each screen, which become assertions, and a conventions profile read from the repository, so the file reuses existing fixtures and page objects instead of duplicating selectors inline.
How is an AI testing tool different from a coding copilot in the IDE?
A copilot writes what you describe in a prompt. GitHub Copilot, for example, picks up repository conventions from an instructions file the user writes, and its paid plans are billed per month. (checked 2026-09-08) Retracio starts from a recorded manual run instead of a prompt, so the steps and expected outcomes come from what the tester did and marked. Conventions come from the existing tests without a written instructions file. The app is free during the beta, and generation goes through your own Anthropic API key.
What does Retracio read from my repository?
The app reads the local checkout only. From it, it takes the framework and language, the folder where E2E tests live, file and test naming, existing page objects and fixtures, assertion style, lint and formatter config, and custom helpers. That becomes a conventions profile. Excerpts of that profile go to the LLM together with the recorded steps and trimmed DOM snapshots. The repository is never cloned or uploaded, and the only files the app writes are the generated tests in the folder you choose.
Does my source code leave my machine?
No. What leaves the machine is the recorded steps, trimmed DOM snapshots of the pages under test, and excerpts of the repository's test conventions such as page object names, fixtures and naming patterns, sent to the LLM provider for generation. Source code, generated tests, browser sessions and cookies, screenshots and recordings, and credentials stay local. The LLM provider is Anthropic Claude, called through your own API key, so requests go under your account and there is no vendor-side store of your sessions.
What frameworks and languages are supported?
Today the output is Playwright in TypeScript or JavaScript, and the desktop app runs on macOS and Windows. Cypress and WebdriverIO are planned as output frameworks; Python and Java are planned as languages. Generated tests run in GitHub Actions and GitLab CI, with Jenkins, Azure Pipelines and CircleCI planned. Because the output is a plain spec file, it executes with the Playwright runner already in your repository and needs no extra package.
Can I edit the generated test before committing?
Yes, and the review step is built around it. The draft opens as a diff inside the app, where you rename a step, tighten an assertion, or change anything else in the file. A single click executes the test locally with Playwright and shows pass or fail per step. If a step fails, you can regenerate that step alone; the rest of the file, including edits you already made, stays untouched. Committing happens in your own workflow.
Can AI write Playwright tests?
It can, and the useful question is whether the result looks like your other Playwright tests. A model given only a description produces a spec with inline selectors and its own naming. Given a recorded run plus a conventions profile from the repository, it produces a spec that imports your fixtures and page objects, matches your locator style, and passes your lint config. The test then executes locally with Playwright, so you see a green run before the file reaches review.
Can AI write Cypress tests?
Cypress output is planned and is not part of the current beta, which generates Playwright specs in TypeScript and JavaScript. The recording and the conventions profile do not depend on the framework: the recorded run holds steps, locators and marked expectations, and the profile holds structure, naming and style. Cypress and WebdriverIO output will build on the same inputs. If your suite is on Cypress today, the beta fits only if you also run Playwright in the same repository.
How accurate are AI generated tests?
There is no published accuracy figure yet; internal measurements are still being collected and will appear on this page with the number of runs and the date. What you can verify yourself: every check the tester marked during the run appears as an expect in the output, the locator breakdown by role, label, test id and CSS is shown on the review screen, and the draft executes locally against the same application before commit. A test that passes there and passes code review is the measure that counts.
Do AI generated tests require maintenance?
They do, like any E2E test, and the aim is to keep it at the level of editing instead of rewriting. Because the output is plain Playwright in your repository, you maintain it with the tools you already use. When a step fails after the app under test changes, you regenerate that single step and the diff shows exactly what changed. Locators by role, label and test id outlive markup changes that would break a CSS path. Nothing rewrites a test without your review.
How do AI generated tests integrate with CI/CD?
The generated file is committed to a branch and opened as a pull request like any other test. It runs in the existing pipeline with the Playwright runner, alongside the rest of the suite, and reports on the pull request. No runtime, plugin, or service from the app is needed in CI. If the repository has no E2E job yet, the app offers a ready job snippet for GitHub Actions or GitLab CI, and the manual scenario then runs on every push.
Can I use Playwright without coding?
The manual run needs no code: you walk through the scenario in the browser and mark what should be true on each screen. The output, though, is code, a Playwright spec file in your repository, and it goes through the same review as any other test. Someone on the team reads the diff, executes it, and commits it. The app is meant for teams that already own a test codebase and want manual runs to land in it.
Can AI test generation replace manual test writing?
It removes the part where a tester's run is retyped as code. The run itself, the decisions about what to check, and code review stay with people. A tester walks through the scenario and marks expected outcomes; the generator turns that run into a spec in the repository's style; a reviewer reads the diff and commits. Scenario design and review still take time. What disappears is the gap between a manual test case that exists on paper and an automated test that runs on every push.
What is AI test generation?
It is the use of a language model to produce test code from an input other than hand-written code: a description, a recording, or a walk through the application. Approaches differ in what the input is and where the result lives. In this app the input is a recorded manual run plus a conventions profile read from your repository, and the output is a Playwright spec file placed in that repository, run locally before commit and then by your own CI.
Start with your next manual test run
Leave your email and we write when a build for macOS or Windows is ready. Record one run, get a plain Playwright spec in your own repository.