Ranveo
WebChrome, Edge, Firefox and Safari

Web testing with the team tools built in.

Test any web page in Chrome, Edge, Firefox or Safari, on your machine or on a browser farm. Nothing to add to the page, and the same tests, runner and AI as for your devices.

In your page: nothing. No script, no SDK, no build step.

  1. open/rollouts/4.2.0
  2. tapbutton "Pause rollout"
  3. expectstatus "Paused"
  4. budgetLCP 1.4 s of 2.5 s
  5. Passed in Chrome, Edge, Firefox and Safari
Performance · Network · Elements · Console

Everything DevTools shows, a test can check.

Ranveo drives the browser over the DevTools Protocol or WebDriver, in its own temporary profile. Nothing goes into your page, and your cookies and clipboard stay untouched.

LCP1.4 s / 2.5 s
CLS0.02 / 0.1
INP120 ms / 200 ms
Long task310 ms / 200 ms
budget: long_task_ms_max 310 > 200

Performance budgets that fail the test.

LCP, CLS, INP, long tasks and the JavaScript heap, measured in every test. Over the budget, the test fails.

MethodPathStatusTimeRule
GET/rollouts/4.2.0200118 ms
GET/api/rollouts/4.2.020036 ms
GET/api/fleet/health5033 msrule: failed
POST/api/rollouts/4.2.0/pause2002.0 srule: delayed
GET/api/alerts20041 msrule: changed

Mocked and delayed responses.

A rule gives a made-up, failed or delayed answer, or changes the real one. Offline and throttling too, in Chrome and Edge.

<div class="rollout-actions">
  <button data-testid="pause-rollout"
          type="button">Pause rollout</button>
  <span role="status">In progress</span>
</div>
name pause-rolloutrole buttontext "Pause rollout"

Found the way your users see it.

data-testid, else id, else name; ARIA roles in Ranveo’s words; Shadow DOM and frames searched too.

logrollout 4.2.0: 8,486 of 12,480 updated

warnResizeObserver loop completedallowed

errorTypeError: cannot read “stages” of undefinedfails the step

{ "errors": { "fail": true,
  "allow": ["^ResizeObserver loop"] } }

Errors in the console fail the test.

A swallowed exception is a bug even when the screen looks right. Known noise goes in an allow list.

Migration

Bring your Playwright tests.

Import them as Ranveo tests, or keep running them: @ranveo/playwright-reporter sends their results to Ranveo for history, bug tracking and reports. WebdriverIO results too.

todo.spec.tsPlaywright
  1. test('adds a todo', async ({ page }) => {
  2. await page.goto('/');
  3. await page.getByPlaceholder('What').fill('milk');
  4. await page.keyboard.press('Enter');
  5. await expect(page.getByTestId('todo')).toHaveText('milk');
  6. });
adds-a-todo.test.jsonRanveo
  1. test"Adds a todo"
  2. open"/"
  3. taptext "What"
  4. type"milk"
  5. keyEnter
  6. waitname "todo" text "milk"
  • ranveowall import-playwright tests/
  • page objectsbecomesteps files
  • fixturesbecomesetup and teardown
  • the restbecomeAI steps, with the original line
Ranveo and Playwright

More than a test library.

One scenario, run with both on 2 November 2026, and what a team gets with Ranveo that Playwright leaves to you.

Same scenario · 2026-11-02RanveoPlaywright
Green, a delayed page included16/1616/16
A changed UI, reported after32.5 s6× sooner191.3 s
Run time, no trace3.0 s3.8 s
Run time, traces of failed tests5.3 s3.9 s
Web Vitals with budgetsbuilt ina separate tool
Reportsa team serverHTML, per run
A demo video of the testMP4, with cursor–
Device, web and mobile app in one testyesthe web part only
  • No code needed

    Testers and product people use the live editor, step recording or the AI chat. Developers get Python and TypeScript clients and pytest export.

  • A team server, built in

    History, test health, a scheduler, environments, secrets, PDF reports and approval of reference images.

  • One bug per cause

    Failures with the same cause are grouped into one bug, and sent on to Jira, GitLab or GitHub.

  • AI that checks the AI

    A second AI audits every test the AI writes, by looking at its screens.

  • Your AI, or a local one

    It runs on your own AI subscription, with no credits to buy. With a local model (Ollama), all of it works offline.

  • What a screenshot misses

    Clipped or overlapping text, in any language, found from the page’s elements, not from pixels.

  • One binary

    The runner, the server and the MCP server come as one file. No Node, no npm.

  • Pay per concurrent test

    Unlimited users, and more apps cost nothing extra. The free tier covers the web, commercial use included.

Browsers

Every major browser, or a browser farm.

Headless Chrome, Chromium and Edge out of the box. Firefox and Safari over WebDriver. BrowserStack, Sauce Labs, TestMu AI or BitBar with one setting.

Chrome, Edge

DevTools Protocol · headless
  • Mouse, keys, hoveryes
  • Live view30 fps
  • Mocked responsesyes
  • Throttling, emulationyes
  • Web Vitalsyes
  • Downloadsyes

Firefox

W3C WebDriver
  • Mouse, keys, hoveryes
  • Live view5 fps
  • Mocked responsesyes
  • Throttling, emulationno
  • Web Vitalsno
  • Downloadsno

Safari

W3C WebDriver
  • Mouse, keys, hoveryes
  • Live view5 fps
  • Mocked responsesno
  • Throttling, emulationno
  • Web Vitalsno
  • Downloadsno

On a farm

one setting: farm=browserstack
  • BrowserStack
  • Sauce Labs
  • TestMu AI
  • BitBar

Credentials stay in secret project variables, and the session id and recording link go into the test log. Ranveo opens no tunnel.

The hard parts

Handled, so your tests stay short.

  • route

    Mocked and delayed responses

    A rule gives a made-up, failed or delayed answer, or changes the real one.

  • emulate

    Language, time zone, dark mode

    Emulate them in a step, and check the page follows.

  • a11y

    Accessibility built in

    axe-core’s WCAG 2.1 A and AA rules, frames from other origins included.

  • frames

    Shadow DOM and frames

    Web components and embedded frames, payment forms included, are searched like the page.

  • new tab

    Pop-ups and new tabs

    A new tab comes to the front by itself. One step closes it.

  • vars

    Local and staging, one test

    Put ${vars.stack} in the address and pick the environment per run.

Set up

From address to first test in three steps.

  1. Point it at a page

    Any address: http, https or a local file.

  2. One profile, every environment

    The run picks the address of the environment.

  3. Or run it on a farm

    The farm’s user and key come from secret variables.

# 1 · point it at a page
$ ranveowall test tests \
  --web http://localhost:3000/ --viewport 1024x768

# 2 · one profile, every environment
$ ranveowall add-profile --profile-id web \
  --platform web --set 'url=${vars.stack}/launcher'
$ ranveowall test tests --profile-id web \
  --var stack=https://test.example.com

# 3 · or run it on a browser farm
$ ranveowall add-profile --profile-id shop-bs \
  --platform web --connection webdriver \
  --set farm=browserstack --set 'key=${vars.bs_key}'
Under the hood

The page, as your users see it.

Ranveo reads the page’s DOM and accessibility roles, and acts like a user: real mouse and key events, at the visible part of the target.

Name
data-testid, else id, else the name attribute
Text
aria-label, a field’s value or placeholder, or the visible text
Role
The ARIA role in Ranveo’s words, else from the element
Screen
window.ranveoScreen, else the hash route, else the path

Today

  • Real clock only: a test waits for a condition or for the page to settle, never for a fixed time.
  • State values need the page’s window.ranveoSubjects; without it, check the screen or call a command.
  • Fonts render differently on each system, so record reference images where CI runs.

Roles, from the element or ARIA role

  • <button>becomesbutton
  • <a href>becomeslink
  • <input>becomesinput
  • textboxbecomesinput
  • <select>becomesdropdown
  • comboboxbecomesdropdown
  • <li>becomesitem
  • optionbecomesitem
  • <dialog>becomesdialog
  • <progress>becomesprogress
  • headingbecomestext
  • <svg>becomesimage

In a test

{ "tap": { "name": "save" } }
{ "tap": { "role": "button", "text": "Save" } }
{ "tap": { "text": "Pay", "within": { "name": "payment" } } }
16/17

conformance checks pass on the web reference app. The one that doesn’t, clock, needs a virtual clock, and a browser runs on real time.

Compare every platform
  • busy: passes
  • clear: passes
  • clock: skipped
  • commands: passes
  • emulate: passes
  • input: passes
  • keys: passes
  • layout: passes
  • locators: passes
  • platform: passes
  • popup: passes
  • reset: passes
  • roles: passes
  • route: passes
  • screens: passes
  • subjects: passes
  • visibility: passes
Questions

Web, answered.

Do I have to change my page?

No. If you want, the page can tell more through a few global functions: its screen name, state values, commands and when it’s busy.

Does Ranveo download browsers?

No. It uses the browsers and drivers installed on the machine, or a farm’s.

Does Ranveo open a tunnel to the farm?

No. The farm opens a public address, or one reached through its own tunnel, such as BrowserStack Local.

Can it test a canvas or a WebAssembly UI?

Yes, when the page lists the objects it draws in window.ranveoObjects: names, roles, texts and boxes.