Evaluating CodeRabbit? Same review, plus real test runs. See why

UI testing

It clicks through your app the way a user would.

Describe the flow in a sentence. Qodex drives the real app, brings back a screenshot of what broke, and saves the run as Playwright you own.

We now detect issues in staging instead of finding them after deployment.
Anshuk K.AI & Data Engineer, verified G2 review
Read the review on G2
The run

How Qodex tests your UI

Chat is the authoring surface. You say what to try, the agent drives a real browser against your app, and everything it did comes back as steps, screenshots and a test file. Replays are code, not model calls.

Product view. Example data.
Qodex · UI run · checkoutstaging.shop.example
You

Go break my checkout flow. Try it as a logged-out user too.

Qodex

Crawled 34 pages, 61 endpoints, logged in as a buyer and worked the promo path. One assertion failed. Here is what I found.

Real bugCheckout applies an expired promo code

11 steps saved as a draft scenario, failing request and screenshot attached.

checkout-promo.spec.tsreplay: no model call
  1. Tool calls7 of 7
  2. crawl_app staging.shop.example34 pages, 61 endpoints
  3. ui_login as buyersession ok
  4. browser_click Apply promo codeclicked
  5. assert total recalculatedfailed
  6. http POST /api/orders as anonymous201
  7. screenshot cart-total-mismatch.png1280 x 800
  8. compile_scenario 11 stepsdraft saved
  9. checkout-promo.spec.tsreplay: no model call
  • 11steps from one sentence
  • $0per replay, no model call
  • 3failure classes: bug, stale test, environment
  1. Step 01

    Describe the flow in a sentence

    No recorder, no locators, no script. One line in chat is the whole brief.

  2. Step 02

    It drives the real app, every step recorded

    A deterministic crawl finds every page. A real browser clicks through the flow, and every step is logged with a screenshot.

  3. Step 03

    Every failure gets a screenshot and the failing step

    A real bug arrives with the failing step, the request that failed and a screenshot, so nobody has to reproduce it by hand.

  4. Step 04

    Saved as Playwright you own

    Standard Playwright, parameterized per environment, synced to git and exportable. If you leave, the tests leave with you.

  5. Step 05

    Stale tests repaired as a diff, not left red

    When the UI changes, Qodex proposes the updated scenario as a diff you approve. It never rewrites your test behind your back.

  6. Step 06

    Runs on every PR, replay for free

    Every pull request runs the suite against its preview. Replays are generated code with no model in the loop, so the bill does not grow with the suite.

Every failure is classified before it reaches you. A real bug comes with a screenshot and the failing step. A stale test comes with a proposed fix as a diff. An environment issue (a preview that did not boot, a third party that timed out) is flagged and not counted as a failure.

What it finds

One example run.

One sentence in, seven tool calls, one failed assertion, and a finding with the screenshot and the failing request attached.

You said

Go break my checkout flow. Try it as a logged-out user too.

  1. crawl_app 34 pages, 61 endpointsok
  2. ui_login as buyerok
  3. browser_click Apply promo codeok
  4. assert total recalculatedfailed
  5. http POST /api/orders as anonymous201
  6. screenshot cart-total-mismatch.pngok
  7. compile_scenario 11 stepsdraft
Real bugCheckout applies an expired promo code
checkout-promo.spec.ts draft · 11 steps

11 steps saved as a draft scenario, failing request and screenshot attached.

POST /api/cart/promo
code: SPRING20 (expired 2026-03-31)
expected total $84.00 · got $67.20
Screenshot attached · replay: no model call

Example run. Real findings from your own app replace these.

Your team

Built for the way your team tests

  • Self-healing you approve

    A stale test becomes a proposed diff, not a silent rewrite and not a red build.

  • A coverage map

    Every page the crawl found, marked tested, untested or failing.

  • Multi-viewport

    Screenshots at desktop, tablet and phone widths on every run.

  • Parameterized environments

    One scenario, run against preview, staging or production by variable.

  • Run from anywhere

    Every pull request, on demand, on a schedule, from CI, a deploy hook or a webhook.

Your stack

Works with what you have

Your app, your repo, your chat. Nothing to install in the app and no runner in CI.

  • Playwright
  • GitHub
  • GitLab
  • CLI
  • Slack
  • Webhooks
  • Jira
  • Sentry
Add-on

And it reviews the pull request too.

The same agent that drives your UI reviews the pull request that changed it: static analyzers, a full read of every changed file, two frontier models, and live probes against the preview. A UI finding lands on the pull request with its screenshot, and the Check Run can hold the merge.

See AI code review
On the pull request
qodexcommented on #1473

UI run against the preview: 1 of 12 scenarios failed. Checkout applies an expired promo code. Failing step, request and screenshot attached below.

ui run
In the checks
qodex / ui 1 of 12 failed
checkout-promo.spec.ts
assert total recalculated · failed

Screenshot attached · cart-total-mismatch.png

Qodex / ui · 1 real bug · merge blocked
evidence

Example finding. Real ones link to the pull request.

Security

Built to be trusted with your app.

  • Nothing to install

    No SDK in your app, no runner in your CI. Qodex needs a URL and read access to the app under test.

  • Encrypted and isolated

    Runs, screenshots and scenarios are encrypted in transit and at rest, and isolated per project.

  • Never trains on your app

    Your screens, flows and findings are never used to train models.

  • Bring your own key

    Use your own model key if you prefer. Every token is logged, and replays use none.

Customers

What teams say on G2.

  • G2 · Enterprise
    We now detect issues in staging instead of finding them after deployment.

    Anshuk K.

    AI & Data Engineer

    Verified G2 review
  • G2 · Financial services
    The no-code interface helps our whole integration team write and manage test cases, and drastically reduces the time spent on QA.

    Rishabh V.

    AI Engineer

    Verified G2 review
  • G2 · Small business
    It lets our small team stay confident in releases without needing a dedicated QA resource.

    Sameer C.

    Software Engineer

    Verified G2 review
FAQ

Questions teams ask before switching.

How does Qodex handle flaky tests?

By not running a model at replay time. A saved scenario is plain Playwright: the same steps, the same assertions, no model in the loop, so the same input gives the same result every run. When a run does fail, it is classified before you see it: a real bug, a stale test, or an environment issue such as a preview that did not boot. Only the first counts as a failure.

What happens when the UI changes?

The test does not just go red. Qodex re-drives the flow, works out what moved, and proposes the updated scenario as a diff. You approve it or reject it. Nothing is rewritten behind your back, and the approved version is what runs next time.

Which browsers and viewports does it run on?

Runs use Playwright browsers, Chromium first. Every run captures screenshots at desktop, tablet and phone widths, so a layout that breaks only on a phone shows up next to the desktop shot, not in a bug report a week later.

What do we own if we leave?

Everything the agent wrote. Each scenario is a standard Playwright spec, parameterized by environment variables, synced to your git repository and exportable at any time. There is no proprietary runtime and no recording blob. The tests run anywhere Playwright runs.

What does a run cost?

Authoring a scenario uses a model once. Replaying it uses none, so a replay costs $0 in model spend whether it runs on every pull request, on a schedule, or from a webhook. If you bring your own model key, every token spent on authoring is logged against it.

How is this different from a record-and-replay tool?

A recorder captures the clicks you made and replays them against selectors that break when the page changes. Qodex starts from a sentence, finds every page with a deterministic crawl, drives the flow in a real browser, and saves the result as Playwright you can read and edit. When the page changes it proposes the fix as a diff instead of failing, and every failure arrives with the screenshot and the step that failed.

Something else? Get in touch

Get started

Stop merging on faith.

Install the GitHub app, point Qodex at your staging URL, and the next pull request gets tested before it merges.

  • Nothing to install in your app
  • No credit card
  • Scenarios you own