Web app testing · Playwright

Do the check once.
Keep it as a Playwright test.

Enter your app’s URL, click through the flow you already test and say what should happen. SaySpec turns that walkthrough into a Playwright test that has already passed once, ready to run again before every release.

How it works

From a manual walkthrough
to an automated test.

  1. 01

    Open your app

    Enter a starting URL and SaySpec opens your app in a browser window on your Mac, using the Google Chrome, Chromium or Microsoft Edge you already have. Start and stop each test from the small SaySpec overlay on the page.

  2. 02

    Show it and say it

    Click, type and move between pages as usual while you narrate what matters, such as “after I apply SAVE20, the total drops by $20.” SaySpec records every action with a screenshot and transcribes your voice on your Mac. Password, token and card fields are left out of the recording.

  3. 03

    Get a Playwright test

    Your own coding agent, Claude Code or Codex, writes the test in a terminal inside SaySpec, runs it and revises it until it passes. SaySpec then runs it once more by itself and saves it only if it passes.

  4. 04

    Run it again

    Pick your tests, set the base URL, for example a local build or staging, and start a test run. Every failure keeps its Playwright trace, a screenshot and the error, and you can retry a single test without losing the earlier attempts.

  5. 05

    Fix what fails

    Explain failure tells you whether the app, the test or the environment is at fault. SaySpec can then propose a patch to your app or to the test. Nothing changes until you approve the exact patch, and you can commit it to a new branch and open a pull request.

What you keep

Readable Playwright code.
In your repository.

Keep tests in SaySpec on your Mac, or in a folder you choose, such as your Git repository. There, each test is a .spec.ts file: Playwright code with a short comment header that lists its steps and what each one checks, so it reads well in a code review.

Example · coupon-reduces-cart-total.spec.ts
// SaySpec test · the @ lines are maintained by SaySpec
// @title: Coupon reduces cart total
// @step: Apply the coupon SAVE20 in the cart
// @expect: The cart total drops from $80 to $60

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

test('coupon reduces cart total', async ({ page }) => {
  await page.goto('/cart');
  await expect(page.getByTestId('cart-total')).toHaveText('$80');
  await page.getByLabel('Coupon code').fill('SAVE20');
  await page.getByRole('button', { name: 'Apply coupon' }).click();
  await expect(page.getByTestId('cart-total')).toHaveText('$60');
});

Why Playwright

The framework
web teams already use.

Playwright is the open-source end-to-end testing framework many web teams already run. It finds elements by role, label and test ID, and it waits for the page by itself, so a recorded test is less likely to break on a slow response. Your developers can read, review and change every test SaySpec writes.

Testing a Flutter app as well? See Flutter app testing.

Get SaySpec

Record your first web test.

Turn the walkthrough you already perform into a Playwright test.

Get SaySpec app

Questions, answered.

What do I need?

A Mac with Google Chrome, Chromium or Microsoft Edge, and Claude Code or Codex signed in on it. In SaySpec, Settings → Machine setup checks the rest, such as Node.js, Playwright and the on-device transcription runtime, and installs what is missing.

Does my app need any changes?

No. SaySpec records your web app as it runs in the browser. Accessible labels and data-testid attributes on important controls help the test find the right elements.

Where do my recordings go?

Recordings, screenshots and tests stay on your Mac unless you share a test with your SaySpec Cloud workspace. Narration is transcribed on your Mac by default. To write the test, the coding agent you choose reads the recording under your own account with its provider.

Can AI change my app without approval?

No. A proposed fix is applied only after you approve the exact patch, and SaySpec then reruns the unchanged test against the patched app.