Guide

Web browser testing software, graded by what it draws inside the browser tab

Most lists of web browser testing software grade by feature checklists: parallel browsers, real-device cloud, AI assistance, CI integrations. Useful, but it conceals a sharper line. Every product in this category sits on the same primitive (a browser engine plus the Chrome DevTools Protocol), so the features are interchangeable. The categorical split that actually matters is what the software puts inside the live browser tab while it runs. This page walks the four families, then reads the 67-line script Assrt injects to make a cursor visible in the recording.

M
Matthew Diakonov
9 min read

Direct answer (verified 2026-05-08)

Web browser testing softwareis software that drives a real browser engine (Chromium, Firefox, or WebKit) to verify that a web app's UI works for users. Four families populate the category: code libraries you program against (Playwright, Cypress, Selenium), low-code platforms that compile recordings or YAML into runs, cross-browser cloud grids that rent the browsers themselves (BrowserStack, LambdaTest, Sauce Labs), and AI agent layers that turn a plain-English plan into real Playwright code (Assrt). The same browser engine, four very different artifacts. Verified against the upstream docs at playwright.dev and the cloud-grid baseline at browserstack.com.

The four families, by what you walk away with

The dividing line nobody draws on a feature matrix: after a run, what is in your hands? Not which boxes were ticked, but the actual artifact you can open, share, or check into git.

Family 1

Code libraries

Playwright, Cypress, Selenium. You write a .spec file and the runner executes your code. The artifact is your code, on your filesystem, in your repo. The cost is that you write and maintain selectors, waits, and fixtures yourself, and the test suite is exactly as good as the engineer who maintains it.

Family 2

Low-code and YAML platforms

Tools where the test is a recording or a YAML doc compiled into runtime steps. Fast to author, easy for non-engineers to edit. The artifact is the YAML or the platform's proprietary format; portability ranges from good (Maestro flows are plain YAML) to poor (closed formats that only run inside the vendor's runtime).

Family 3

Cross-browser cloud grids

BrowserStack, LambdaTest, Sauce Labs. The browser is the product. You bring your Playwright, Cypress, or Selenium scripts and run them against thousands of real device and OS combinations. The artifact is the run log in the vendor's dashboard plus whatever ZIP they let you download. Engine-coverage breadth is the win; ownership of the run history is the cost.

Family 4

AI agent layers (the new family)

An LLM picks the next browser action from a plain-English plan, then emits real code you can read. Assrt sits here: you write a Markdown scenario, the agent drives Playwright MCP, and on disk you get a Playwright-compatible test plus video, screenshots, and an events log. Source at github.com/assrt-ai/assrt-mcp. MIT-licensed; nothing canonical lives in a vendor cloud.

What runs in the browser tab during a test

Same engine, very different runtime. A reviewer who watches the recording sees the difference immediately.

FeatureMost browser testing softwareAssrt (agent layer)
Cursor visible in the page recordingNo; cursor exists only in CDP, never in the DOMYes; red dot glides on CSS transition
Click ripple in the page recordingNoYes; 40px outward animation on every click
Keystroke caption visible in the recordingNoYes; bottom-center monospace toast on every keypress
Heartbeat that forces continuous compositor framesNo; frames captured externally, gaps during idle momentsYes; 6px green pulse with infinite animation
Re-injected after every navigationN/A; nothing to re-injectYes; browser.ts:520, after each navigate()
Adds nodes to the page DOMZero added nodes4 fixed nodes, pointer-events:none, z-index 2147483647

The last row goes the other way. Adding four fixed-position nodes is real DOM. They never receive events and they sit at the maximum z-index, but if your tests assert on document.body.children.length, the count differs by four. Most teams do not, and gain a recording a human can actually read.

The script that draws the cursor

This is the anchor fact. The CURSOR_INJECT_SCRIPT lives at /Users/matthewdi/assrt-mcp/src/core/browser.ts, lines 33 through 100. It is plain JavaScript, runs in the page context, creates four fixed-position elements, and exposes three helper functions on the page's window object. Read the trimmed excerpt below, or open the file in the published source on GitHub.

assrt-mcp/src/core/browser.ts

A few things to notice. The guard if (!window.__pias_cursor_injected) makes re-injection safe: the manager calls injectOverlay() again after every navigation (since the new page has a fresh DOM) but the script is idempotent. The cursor uses transition: left 0.3s ease, top 0.3s ease rather than instant repositioning, so on the recording the dot glides between elements at human-watchable speed instead of teleporting. The toast uses font-family: monospace; keystroke captions look like terminal output overlaid on the page, which matches the developer-facing tone of the rest of Assrt's artifacts.

Anchor fact (verifiable in source)

All four overlay elements (heartbeat, cursor, ripple, toast) are set to z-index: 2147483647. That number is the maximum 32-bit signed integer, the largest value the CSS spec guarantees a browser will accept for z-index. It is the same idiom used by browser extensions (uBlock Origin, React DevTools) when they need to paint above arbitrary application content. You can grep the file yourself: grep -n 2147483647 src/core/browser.ts.

How a click flows through the overlay

The agent decides to click an element described in plain English ("Sign in button"). Before the actual click fires, Assrt locates the element, computes the center point of its bounding rect, and tells the in-page helpers to glide the cursor there and ripple. Then the click happens. The recording captures the dot already on the target by the time the click event fires, so a reviewer watching the playback understands what just happened.

One agent click, end to end

AgentBrowser managerPage DOMclick('Sign in button')injectOverlay() (idempotent)querySelector + fuzzy text match{ x, y } center of bounding rect__pias_showClick(x, y) -> cursor glide + ripplePlaywright click at (x, y)click event fires; UI updatesscreenshot saved as 03_step4_click.png
assrt-mcp/src/core/browser.ts

What changes for the human watching the recording

Same Playwright click, two different recordings

The recording is the page's pixels. A button looks unpressed in frame N, looks pressed in frame N+1, and a URL changes. The cause of every visual effect happens off-screen, in the test runner's process, with no on-page indication.

  • No cursor visible in playback
  • Click effects appear without their causes
  • Hard to debug by skimming
  • Captures only what the page rendered

Picking from the four families

A practical split, in plain order:

  • You have an engineer who likes maintaining selectors. Pick a code library. Playwright is the safest default in 2026. You will write tests, you will own them, and you will spend real time on flakiness.
  • You ship to dozens of browser/OS combinations and one of them is genuinely different. Add a cross-browser cloud (BrowserStack, LambdaTest, Sauce Labs) on top of your code library. Use it for breadth, not depth.
  • Your QA work is mostly recorded by non-engineers and run on a schedule. A low-code platform earns its place. Pay attention to portability of the recording format if the vendor disappears.
  • You want the test plan in plain English, the artifacts on disk, and a recording a non-engineer can actually watch. That is the Family 4 case, and that is what Assrt is built for. One command: npx @m13v/assrt discover https://your-app.com.

The four families are not direct substitutes. A team running Playwright benefits from adding Assrt for high-churn flows where selectors drift faster than humans can update them. A team running BrowserStack still needs the underlying script, and the script can still be Playwright code Assrt generated. The categorical line is what survives outside the vendor; pick for ownership first, features second.

Walk through your testing stack on a 20-minute call

If you are choosing between web browser testing software, bring your current stack. We will read the artifacts together and tell you honestly where Assrt fits and where it does not.

Frequently asked questions

What is web browser testing software, in one sentence?

Software that drives a real browser engine (Chromium, Firefox, or WebKit) to verify a web app's UI works for users. The four families that matter are code-based libraries you program against (Playwright, Cypress, Selenium), low-code platforms that compile YAML or recordings into runs, cross-browser cloud grids that rent the browsers themselves (BrowserStack, LambdaTest, Sauce Labs), and AI agent layers that turn a plain-English plan into runtime browser actions and emit real Playwright code (Assrt is in this last group).

Why split the category by 'what it draws inside the page' rather than by features?

Because every product in the category sits on top of the same primitive: a browser engine plus the Chrome DevTools Protocol. The features are interchangeable. The truer split is the artifact you walk away with after a run, and the proxy for that on screen is what was visibly added to the live page during the run. A cloud grid renders nothing inside the page; it just records the screen frames from outside. A YAML platform usually renders nothing either, because the runtime is a stripped-down headless run. A code library renders nothing by default. An AI agent layer like Assrt is the unusual one: it injects DOM elements into the live page so the recording shows the cursor gliding, clicks rippling, and keys being typed. It is the same browser, the same engine, but the testing software is doing fundamentally different work.

Where exactly is that DOM injection in Assrt's source?

/Users/matthewdi/assrt-mcp/src/core/browser.ts, in a constant named CURSOR_INJECT_SCRIPT that starts on line 33 and ends on line 100. It creates four fixed-position elements (a heartbeat pulse, a cursor dot, a click ripple, a keystroke toast) all at z-index 2147483647 (the maximum 32-bit signed integer, so nothing on the page can paint over them). Three helper functions are added to the page's window object: __pias_moveCursor(x, y), __pias_showClick(x, y), and __pias_showToast(msg). The browser manager class then has private methods injectOverlay, showClickAt, and showKeystroke (lines 428-518) that re-inject the script after every navigation, find target elements either by CSS selector or fuzzy text match, and call those window helpers from inside the page context via browser_evaluate.

Doesn't injecting DOM elements pollute the test? You're testing a page that has extra divs in it.

Yes, in the same way that opening DevTools 'pollutes' a page (it adds an inspector overlay) or that any video screen recorder paints a cursor cap onto the recording. The injected elements are absolutely positioned, fixed at the viewport edges and at z-index 2147483647, with pointer-events:none so they receive no events. They never enter the application's DOM tree's interactive region, never receive focus, and never collide with the app's own elements. The trade is: a tiny amount of additional DOM (four nodes) for a recording where a human watching the playback can see the agent's intent rather than guessing which click event fired which screenshot. Assrt opts in. Other web browser testing software opts out.

If I'm picking web browser testing software, what should I actually compare?

Compare what survives outside the vendor: the test code, the run artifacts, and the browser environment. For test code: does the tool emit a file you could check into git and run with someone else's tooling, or does it store the canonical test in the vendor's database? For run artifacts: is there a video file, a screenshot directory, and an event log on your local disk after a run, or only in a hosted dashboard? For the browser: is the engine an unmodified upstream Chromium/Firefox/WebKit, or a custom build the vendor controls? Speed, parallelism, and CI integrations are downstream of those three answers. If the answer to all three is 'yours,' you have software. If the answer is 'theirs,' you have a SaaS subscription wearing a software label.

Is Assrt actually free? Most AI testing tools are not.

The CLI and MCP server (the @m13v/assrt npm package, source at https://github.com/assrt-ai/assrt-mcp) are MIT-licensed and run end-to-end on your machine. The video recordings, the screenshot directories, the events.json, the player.html, and the generated Playwright tests all land on your local filesystem. The optional cloud at app.assrt.ai gives each scenario a shareable URL, but the local install works without it. The model API call (Anthropic by default) is the one paid dependency; you supply your own ANTHROPIC_API_KEY and pay Anthropic directly. Compare that to QA Wolf, which lists pricing in the thousands per month and runs the canonical tests in their cloud.

Does this work on Firefox and WebKit, or just Chromium?

Playwright supports Chromium, Firefox, and WebKit, and Assrt drives Playwright via the official Playwright MCP protocol (https://github.com/microsoft/playwright-mcp). The DOM injection is plain JavaScript with z-index, position fixed, and CSS transitions, all of which work identically across the three engines. The cursor overlay was tested on Chromium first because that is the default Playwright MCP launch target; the same script injects fine on the Firefox and WebKit launch modes (browser.ts launches via the Playwright MCP CLI with the standard browser flags). For day-to-day use, headless Chromium is the fastest and most common; Firefox and WebKit runs are for engine-specific verification.

What does the recording look like with the overlay vs without?

Without the overlay (the default for Playwright, Cypress, Selenium, and most cloud grids), the recording shows the page's pixels: a button that was already in the DOM suddenly looks pressed, a form value appears, a URL changes. The cause of each effect is invisible. With the overlay, the recording shows a 20-pixel red dot gliding across the page on a 0.3-second ease, a 40-pixel ripple animating outward when a click fires, and a black-on-green monospace toast at the bottom of the page when keys are typed. A reviewer can rewind to the moment the dot lands on the wrong element and immediately see the bug; without the dot, they would see the result of the wrong click and have to back-derive the cause.

Why z-index 2147483647 specifically? That's an oddly precise number.

It is the maximum 32-bit signed integer, the largest value the CSS spec guarantees a browser will accept for the z-index property. Setting an overlay's z-index to that value is the standard idiom in browser extensions, screen recorders, and any code that wants to paint above arbitrary application content without knowing what z-indexes the application is already using. The CURSOR_INJECT_SCRIPT in browser.ts uses it for all four elements (heartbeat, cursor, ripple, toast) so a misbehaving app stylesheet cannot accidentally hide the visual feedback. If you grep extensions like uBlock Origin or React Devtools for that integer, you will see the same trick.

Can I trust an AI agent to drive web browser testing software at all?

Trust the artifacts, not the agent. The agent picks the next action; you read the result on disk. After every run, Assrt writes execution.log (every reasoning step), events.json (structured tool calls), screenshots/NN_stepN_action.png (one per turn, zero-padded so they sort by execution order), video/recording.webm (the full session), and player.html (a self-contained timeline player). If the agent did something wrong, you see it in the log and the video, you fix the scenario.md, and the next run differs. The agent is not the source of truth; the scenario plan and the recorded artifacts are. That is the difference between an AI test layer that is a feature on top of inspectable software and one that is a black box you query through a dashboard.

assrtOpen-source AI testing framework
© 2026 Assrt. MIT License.

How did this page land for you?

React to reveal totals

Comments ()

Leave a comment to see what others are saying.

Public and anonymous. No signup.