Skip to content

Web testing

Click through your app once. QAClan saves what you did as a test it can run again, as often as you like.

Where
Scripts → Record
You need
A feature to file it under
Takes
About a minute
The Scripts page. Record, Import and + New Script sit above the list of recorded scripts.The Scripts page. Record, Import and + New Script sit above the list of recorded scripts.
Record sits at the top of the Scripts page, next to Import.
  1. Open Scripts and choose Record.

  2. Name it after what the journey does — place order, sign up.

  3. Pick the Feature it belongs to.

  4. Put the address the journey starts at into Start URL.

  5. Choose Start Recording. A browser opens.

  6. Click through your app, then close that browser window.

    Closing it is what ends the recording and saves the script.

The Record Script dialog: script name, feature, language, resolution, environment, start URL, and a Start Recording button.The Record Script dialog: script name, feature, language, resolution, environment, start URL, and a Start Recording button.
Name, feature and a starting address. Everything else already has a working default.

Nothing to install, nothing to write

The recorder drives a real browser and writes a real Playwright script. You never have to open that file — but it is there, readable, if you ever want it.

Every field in the record dialog
FieldDefaultWhat it controls
Script NameemptyRequired. How the script is listed.
Featurefirst featureRequired. Which feature the script belongs to.
LanguagepythonWhat the saved file looks like. No effect on how it runs.
Resolution1920x1080Window size while recording. Also 1366x768, 1280x720 and 390x844 for mobile.
EnvironmentnoneOptional. Choosing one reveals the two rows below.
URL VariablehiddenTakes the starting address from that environment instead, so one script can run against staging and production.
PathhiddenAppended to the variable — /login, say.
Start URLemptyWhere the browser opens. Labelled optional, but leaving it empty opens a blank page and you type the address yourself.
Choosing a language

Leave it on Python unless somebody on the team will read the file — then pick the language they already know. Five values: python, javascript, typescript, javascript_test and typescript_test. The last two produce a @playwright/test spec; both use an underscore, and a hyphen is rejected.

A script's language is fixed once it exists. To change it, record or import again.

Recording on a server, or in Docker

The recorder opens a real browser window, and a headless host has nowhere to open it. Record on your own machine, then run the script headless wherever you like — running needs no display.

Skipping the parts you do not want recorded

The recorder has a pause control. Use it while you log in or seed data, then resume for the part you are actually testing.

Prefer the terminal?
qaclan web record --feature <feature_id> --name "place order" --url https://your-app.test

Omit --url to start from a blank page, and add --language typescriptto change the output. Review & Improve is part of the app, so a recording made this way is best opened there afterwards.

Review & Improve

A raw recording is literal: your real password sits in the file, and the test clicks faster than your app can respond. Review & Improve opens by itself when the browser closes and offers to fix that.

Four tabs, each counting what it found. Skip step moves on, Apply makes the change.

Bind — get credentials out of the script

Pick an environment, then a variable for each detected field. The before-and-after shows exactly what will change. Anything you skip stays hardcoded.

The Bind tab: an environment selector, a USERNAME field bound to login_email and a PASSWORD field bound to login_password, each showing the line before and after the change.The Bind tab: an environment selector, a USERNAME field bound to login_email and a PASSWORD field bound to login_password, each showing the line before and after the change.
Recorded values are labelled by kind. Passwords are masked here and never displayed.

Apply stays disabled until you pick an environment

There is nowhere to put the value otherwise. If the key you choose does not exist yet, it is added to that environment with the recorded value — see Environments and secrets.

Waits — stop the test outrunning the page

Steps that load something get a wait that pauses only as long as the page actually needs. Nothing is switched on for you: turn on the recommended ones, or use Add a wait to every step if you are not sure.

The Waits tab listing five recommended steps, each with the reason it was recommended and the line of code it refers to.The Waits tab listing five recommended steps, each with the reason it was recommended and the line of code it refers to.
Every candidate names the step, the reason and the line it will change.

Typed — make search boxes actually search

Search fields and autocompletes only react to real keystrokes, so a recording that pastes the whole value never triggers them. Steps that look like search fields are switched on already.

The Typed tab with one recommended step, Type into Search products, already toggled on.The Typed tab with one recommended step, Type into Search products, already toggled on.
Pre-selected, because a search box that never fires is the more common failure.
The fourth tab: Files

Files you attached during the recording — an avatar, a CSV import — are captured so the run can upload them again. The tab lists them and stays reachable even when there is nothing to review, which is why it carries no count.

A global size cap keeps a stray large file out of your workspace. Raise it with qaclan set-upload-cap <MB>; captured files live in ~/.qaclan/uploads/.

Running it again later, or one pass at a time

Open any script and the editor has the same Review & Improve button. The arrow beside it runs a single pass — bind only, waits only, or search inputs only.

From the editor, changes land in the open editor and are yours to save or discard. Straight after a recording they are written to the script immediately.

The script editor

Edit on any row opens the real file, in whatever language it was recorded in, alongside its name, a read-only language badge and a per-script wait limit.

The script editor showing the recorded Playwright file alongside its name, language badge, wait limit selector, and the Insert Variable and Review & Improve controls.The script editor showing the recorded Playwright file alongside its name, language badge, wait limit selector, and the Insert Variable and Review & Improve controls.
Insert Variable drops a {{KEY}} at the cursor; Review & Improve reopens the four tabs above.
The per-script wait limit

Every run picks a wait limit for the whole suite. One script that talks to something slow does not justify raising it for everything else, so set an override on that script instead.

The choices are Inherit suite default (the default) plus 5s, 10s, 15s, 30s, 45s and 60s. Inherit takes whatever the run dialog was set to; anything else wins over the run dialog for that one script. See Suites, runs and reports.

The other two row actions

View reads the script without changing it. Delete removes the script and its file, warning you first if a suite still uses it.

Features — how scripts are grouped

A feature is a folder for related scripts, usually one user-facing capability: checkout, sign-up, search. Every script belongs to exactly one.

Features → + New Feature, give it a name, done. The list then shows a script count against each one and flags any that is still empty.

The Features page listing features with the number of scripts in each.The Features page listing features with the number of scripts in each.
Features created here are browser features. API work is organised by collections instead.
The New Feature dialog, holding a single Feature Name field.The New Feature dialog, holding a single Feature Name field.
One field. Features made here are browser features.

Deleting a feature deletes its scripts

You are asked to confirm, and the scripts inside it go with it.

Prefer the terminal?
qaclan web feature create "checkout"
qaclan web feature list
qaclan web script list [--feature <feature_id>]
qaclan web script delete <script_id>

Importing a Playwright script you already have

Already have codegen output? Bring it in rather than re-recording. Imported scripts join the same features, suites, runs and reports as anything recorded here.

Scripts → Import and pick the file. A preview opens first: it detects the language and offers to turn a hardcoded address into a {{BASE_URL}} variable so the script can switch environments later.

The Import Script preview: the filename, the detected language, a radio list of URLs found in the file, the URL key field, and the raw file content.The Import Script preview: the filename, the detected language, a radio list of URLs found in the file, the URL key field, and the raw file content.
The URL it found is templated by default. Choose Skip to leave the file exactly as written.

Process & Open Editorthen asks for a name and a feature, and gives you the same editor — including Review & Improve — before you save.

Prefer the terminal?
qaclan web script import ./tests/checkout.spec.ts --name "checkout" --feature <feature_id> --language typescript

Then run it

A single script is not the unit of work — a suite is. Ordering, shared browser state, run options and reports are in Suites, runs and reports.