selfcure
selfcure × Selenium

Migrating off Selenium?
Check if your frontend is ready first.

Your Selenium suite is a wall of By.xpath("//div[3]/button[2]") because the frontend never gave it anything better. Rewriting it in a modern framework without fixing the frontend just moves the brittleness. selfcure scores your frontend's testability, finds the XPath/CSS selectors that match multiple elements, and ships data-testid fixes as a Pull Request — so the migration targets stable hooks from day one.

Root cause

Brittle XPath is a frontend symptom

Positional XPath is the last resort when there's no stable hook. The migration question isn't "which framework" — it's "is the frontend even testable yet?" Two patterns decide that:

No stable hook

No data-testid, id, or accessible name forces positional XPath like //button[2] that any markup change breaks.

Ambiguous selector

A selector matches several elements; the test relies on document order. selfcure detects this at the source and proposes a unique data-testid.

Fix the frontend once, and every framework — old or new — benefits.

Before / after

From positional XPath to a stable contract

✗ Brittle — positional, order-dependent

// Java — breaks when the DOM shifts
driver.findElement(By.xpath("//form/div[2]/button[2]")).click();
driver.findElement(By.cssSelector(".btn-primary")).click();

✓ Stable — unique by contract

// data-testid added by a selfcure PR
driver.findElement(By.cssSelector("[data-testid='submit']")).click();
driver.findElement(By.cssSelector("[data-testid='email']")).sendKeys("a@b.com");

Same idea in Python, C#, or JavaScript Selenium — selfcure fixes the app, not your test language.

How it works

De-risk the migration in three steps

01 · SCORE

Measure readiness

A 0–100 testability score per component tells you, with a number, whether the frontend is ready to be automated.

02 · FLAG

Find the brittle spots

selfcure lists every element forcing positional XPath and every ambiguous selector — your migration backlog, prioritized.

03 · SHIP

Open a PR

Pick the fixes, click once. selfcure adds the data-testids and opens a Pull Request on GitHub or GitLab.

Get going

Assess your frontend in two commands

# From your app's root — Node 20+
npx @selfcure/cli init
npx @selfcure/cli lint   # score + flag ambiguous selectors

Connect it to your AI editor (free)

# MCP server — Cursor, Claude Code, VS Code, Windsurf
npx @selfcure/cli mcp

Your AI assistant can query the testability score and ambiguity findings while you plan the migration.

Team tier

The Team plan adds a web dashboard with score history, automatic PR comments, and branch comparison — so you can show the frontend getting more testable as the migration progresses.

Read the getting-started guide →

FAQ

Selenium + selfcure

Does selfcure run my Selenium tests?

No. It analyzes the frontend source so your Selenium suite — in any language — has stable data-testid selectors to target.

Should I run this before or after migrating?

Before. Fixing the frontend first means the migration targets stable hooks instead of porting brittle XPath into a new framework.

Which frontends are supported?

React (.tsx/.jsx), Vue (.vue), Angular (.component.ts), and plain .html.

Is it really free?

The CLI, testability score, and MCP server are free and open source. Auto-fix, PR opening, and the history dashboard are paid.