For React apps

E2E + Visual Testing
for React Apps.

Component refactors break selectors. Client-side routing makes navigation brittle. State from Redux, Zustand, or React Query means subtle bugs slip past React Testing Library. Lastest tests your running app in a real browser - record your flows once, replay deterministic Playwright tests on every commit. Part of the testing toolkit for developers doing QA. Step through how to add visual regression testing to a React app.

Works with any React stackSelf-healing selectors$0 self-hosted
Lastest test recorder capturing a user flow on a React single-page application
Record. Replay. Ship.

Your component tests pass. Your app is still broken. Here's why.

React Testing Library tests individual components in JSDOM - no real browser, no real routing, no real state hydration. When a Redux selector returns stale data, when a route guard redirects to the wrong page, when a layout shift pushes the CTA off-screen, your unit suite has no idea.

01

Lean on unit tests and hope.

You render the component, assert the text, mock the API. It passes. Then a Zustand update fires in the wrong order on production, the toast never appears, and you find out from a user on Twitter - not your CI.

  • JSDOM is not a browser - no layout, no paint, no real navigation
  • State management bugs are invisible to component-scoped tests
  • No visual layer - layout shifts, wrong colors, hidden buttons all pass
  • Integration seams between routes are never exercised
02

Use Lastest. Record once. Replay on every commit.

Point Lastest at your running React app - Create React App, Vite, Next.js, Remix, whatever serves HTML. Click through the real flow. Hit stop. Lastest generates deterministic Playwright code with 7-layer self-healing selectors, captures a visual baseline, and replays the suite on every PR for free.

  • Real browser, real routing, real state - catches what JSDOM can't
  • Survives component refactors - 7-layer selector fallback
  • 3 visual diff engines - pixelmatch, SSIM, Butteraugli
  • Zero tokens per replay - run in CI on every push for $0
  • Works with your stack - Redux, Zustand, React Query, React Router, TanStack

You build with components. Lastest tests the result.

Two capabilities that matter when you're a React developer who also owns QA.

01 · Record

Click through your React app. That's the test.

Open the recorder, navigate your React SPA the way a user does - client-side route transitions, form submissions, modals, toasts. Hit stop. Lastest generates deterministic Playwright code with multi-selector fallback. Component rewrites, className renames, Tailwind migrations - the selectors survive.

  • Works on localhost, staging, or any deployed URL
  • Captures SPA route transitions without page reloads
  • No access to source required - tests the running app
Recorder timeline capturing a React app user flow

02 · Visual diff

Did the last component refactor quietly break the layout?

React component trees re-render on state changes. A new wrapper div, a conditional className, a Tailwind utility swap - your DOM tests pass and the modal is still rendering behind the sidebar. Lastest compares screenshots with three diff engines and surfaces visual drift before the merge.

  • Text-region-aware diffs reduce false positives from dynamic content
  • Branch-to-branch compare for PR review
  • Approve or reject each change with one click
Visual diff slider comparing baseline vs new React app screenshot

Common questions for React developers

How do I E2E test a React app in a real browser without writing Playwright code?
Run Lastest, point it at your React app (CRA, Vite, Next.js, Remix, any React stack), click through your flow once, and Lastest generates deterministic Playwright code with 7-layer self-healing selectors and a visual baseline. Replays run on every commit for $0, with zero AI tokens. No test DSL, no Page Object Model, no Playwright docs.
Why do React Testing Library tests pass while my React app is visibly broken?
React Testing Library renders components in JSDOM: no real browser, no real layout, no real routing. State management bugs from Redux, Zustand, or React Query, and visual regressions from Tailwind class swaps both pass JSDOM and break in production. Lastest tests the running app in a real browser and adds a visual diff layer that catches both.
Component refactors keep breaking my selectors. How does Lastest survive that?
Every recorded action gets seven selector candidates: data-testid, id, ARIA role, aria-label, text content, CSS, and OCR. At replay time the runner walks the chain until one matches, so Tailwind class renames, component rewrites, and styled-components migrations usually pass untouched. If everything breaks, AI Test Fixing proposes a patch you approve in one click.
Does Lastest work with React Router, TanStack Router, or Next.js App Router?
Yes, all of them. Lastest tests the running application, not the routing library, so client-side route transitions, server components, suspense boundaries, and parallel routes all work. The recorder captures SPA navigation without page reloads, which is exactly what React Router and TanStack Router emit.
How do I test Redux, Zustand, or React Query state in E2E tests?
You don't need to mock state. Lastest drives the real React app the way a user does: it triggers the component that dispatches the Redux action, renders the resulting UI, and asserts on what shows up on screen. State management bugs that only fire on real network or hydration timing get caught, instead of being mocked away.
How does Lastest handle React 18 / React 19 hydration and concurrent rendering?
Lastest auto-waits for network quiescence and DOM stability before each action, so concurrent rendering, suspense fallbacks, and useTransition updates settle before the test asserts. Hydration mismatches that only appear after the client takes over (one of the most common React 18+ bugs) show up as visual diffs against the SSR baseline.
Will Lastest work with my existing Vitest or Jest unit tests?
Yes, Lastest is additive. Keep your unit tests for component logic and pure functions; use Lastest for the integration seams unit tests cannot reach: routing, real network, real layout, real visual rendering. Most React teams keep Vitest for component-level coverage and add Lastest for the 5-10 critical end-to-end flows.

Add E2E tests
to your React app.
In five minutes.

No cloud account. No API key. No procurement. Point it at your React app's URL and go. Open source, FSL-1.1-ALv2 licensed, $0 forever.

★ Star & Install from GitHub →
install

# 1. clone

$ git clone https://github.com/las-team/lastest

 

# 2. start

$ cd lastest && docker-compose up -d

 

# 3. point at your React app

$ open http://localhost:3000

 

✓ back to shipping components.