How It Works

Four commands.
Complete test coverage.

Assrt turns your application URL into a production-grade Playwright test suite. No configuration files, no manual test planning, no proprietary runtimes. Just point, review, and ship.

01

Point it at your app

Assrt starts by crawling your application the way a real user would. It reads every page through the accessibility tree, which gives it a structured understanding of buttons, links, forms, headings, and interactive elements. Simultaneously, it uses vision-based analysis to understand layout, visual hierarchy, and how components relate to each other on screen.

You do not need to provide a sitemap, a list of routes, or any configuration at all. Assrt follows navigation links, expands menus, interacts with dropdowns, and discovers pages that are only reachable through multi-step flows. It detects authentication patterns and maps CRUD operations, including create, read, update, and delete cycles that span multiple pages.

The discovery phase typically finds 2-3x more testable paths than manual test planning because it explores edge cases that humans overlook: error states from invalid input, empty states when data is missing, and boundary conditions in pagination or filtering.

Typically finds 2-3x more paths than manual test planning

$ assrt discover https://your-app.com

Crawling... analyzing 142 pages
Mapping user flows from navigation + forms
Detecting auth patterns, CRUD operations, edge cases

✓ Discovered 142 pages
✓ Mapped 38 user flows
✓ Identified 12 form submissions
✓ Found 4 auth-gated sections
✓ Detected 6 CRUD lifecycles

Output: .assrt/discovery.json
02

Review generated tests

Every test Assrt generates is real Playwright TypeScript that you can read, modify, and commit to your repository. There is no YAML that requires a proprietary interpreter, no pseudo-code that only works inside a vendor platform, and no abstraction layer between you and the test runner. What you see is exactly what Playwright executes.

The generated code uses proper Playwright selectors following the recommended priority order: role-based queries first, then test IDs, then text content. Every test includes meaningful assertions, not just "page loaded without errors" but actual verification of content, visibility, and state. The tests are fully type-safe and will surface issues in your IDE before you even run them.

Because these are standard TypeScript files, they show up in pull request diffs, pass through your existing code review process, and live alongside your application code. You own the tests completely. If you ever stop using Assrt, every test continues to work with plain Playwright.

// tests/checkout.spec.ts (auto-generated)
import { test, expect } from '@playwright/test';

test('complete checkout with discount code', async ({ page }) => {
  await page.goto('/products');
  await page.getByRole('button', {
    name: 'Add to cart'
  }).first().click();
  await page.getByRole('link', {
    name: 'Cart'
  }).click();
  await page.getByPlaceholder('Discount code')
    .fill('SUMMER');
  await page.getByRole('button', {
    name: 'Apply'
  }).click();
  await expect(
    page.getByTestId('discount-badge')
  ).toBeVisible();
  await expect(
    page.getByTestId('total')
  ).toContainText('$');
});
03

Describe new tests in English

When you need a test for a specific scenario, describe it in plain English. Assrt uses natural language processing to understand your intent and translates it into a complete Playwright test file. The language model understands verbs like "log in," "navigate to," "click," "fill in," "verify," and "wait for" and maps them to the correct Playwright actions.

The key advantage over writing prompts from scratch is context. Assrt already knows your app from the discovery phase. It knows that "Settings" is a link in the sidebar, that "Team" is a tab within Settings, and that the invite form has specific field names and validation rules. This context means the generated tests use the correct selectors and navigation paths on the first try.

You can describe simple one-step checks or complex multi-page workflows. Assrt handles conditional logic, data dependencies between steps, and cleanup actions. The generated file is saved directly into your test directory, ready to run.

$ assrt generate "
  Log in as admin user.
  Navigate to Settings > Team.
  Invite a new member with email test@acme.co.
  Verify the invitation appears in the pending list.
  Revoke the invitation.
  Verify it disappears.
"

Analyzing intent...
Resolving selectors from discovery context...
Generating test with 6 steps + assertions...

Generated: tests/team-invitation-lifecycle.spec.ts ✓
04

Run everywhere, heal automatically

Tests run with the standard npx playwright testcommand. There is no proprietary test runner, no cloud service requirement, and no special execution environment. Your tests work in GitHub Actions, GitLab CI, Jenkins, or any environment that supports Node.js. You get Playwright's full feature set including parallel execution, trace viewing, and HTML reporting.

The self-healing capability is what eliminates ongoing maintenance. When your UI changes and a selector breaks, Assrt detects the failure, re-analyzes the page to find the updated element, and patches the selector in your test file. It then opens a pull request with the fix so you can review the change before merging. This is not a runtime retry; it is an actual code update that keeps your test suite in sync with your application.

Teams using Assrt report spending zero time on test maintenance. No more Monday mornings fixing broken selectors after a Friday deploy. The tests stay green, and when they do break, the fix is already waiting in a PR.

$ npx playwright test

Running 47 tests across 3 browsers...

  ✓ login.spec.ts (3 tests) .................. 2.1s
  ✓ checkout.spec.ts (8 tests) ............... 4.3s
  ✓ settings.spec.ts (5 tests) ............... 3.0s
  ⟳ profile.spec.ts — healed 1 selector ..... 2.8s
  ✓ search.spec.ts (4 tests) ................. 1.9s
  ✓ dashboard.spec.ts (6 tests) .............. 3.4s
  ✓ onboarding.spec.ts (3 tests) ............. 2.2s

  47 passed | 0 failed | 1 self-healed

Healed: profile.spec.ts
  - getByTestId('avatar-upload') → getByRole('button', { name: 'Upload photo' })
  PR #142 opened with fix

Works with your existing stack

PlaywrightTypeScriptGitHub ActionsGitLab CIJenkinsDockerVercelNetlify

Ready to try it?

Read the documentation to get started with Assrt. Full setup guide, API reference, and CI integration examples included.

Read the docs