Drop-in · Selenium · Playwright · Puppeteer

Self-healing selectors for the test suite you already have.

The frontend team ships twice a week. Class names change. Twenty tests go red at 3am. LumaBrowser is a free, drop-in WebDriver and CDP target with an LLM fallback that re-resolves a selector from a natural-language description — so a UI redesign doesn't cost you Saturday morning.

Download LumaBrowser — free See the drop-in
No migration · no new test framework · works with your existing CI

The story every QA engineer knows. A frontend deploy goes out Wednesday morning. By 11am, fifteen tests are failing in CI. None of the assertions are wrong; the elements are still on the page. .btn-primary just got renamed to .css-8xk2m9 by the CSS-in-JS build. You spend three hours updating selectors, ship the fix, then do it again the next sprint.

What self-healing actually means

Pass a natural-language description alongside your CSS selector. When the selector misses, LumaBrowser routes the request to an LLM with a cleaned snapshot of the live DOM and asks for the matching element. The locator comes back, the test step executes, the run stays green. You learn about the rename from a log line, not a Slack alert.

Without self-heal

Test red, sprint blocked, half the team paged

The assertion is fine. The element is on the page. The CSS class just changed in the latest deploy. Your suite reports a hundred failures and you debug DOMs until the actual bugs get drowned in noise.

With LumaBrowser

Selector misses, LLM resolves, run continues

The CSS path missed. The fallback description — "the primary submit button under the form" — matches one element in the cleaned DOM. The session returns the resolved locator. Test passes. Next deploy, you may not even know the class renamed.

Three lines you change. Nothing else.

Pick your stack. Each tab below is the entire migration: a connection URL and one capability or domain call. Your locators, your assertions, your fixtures, your CI — all unchanged.

# Same WebDriver URL as ChromeDriver. Add one capability.
from selenium import webdriver

opts = webdriver.ChromeOptions()
opts.set_capability(
    "lumabyte:llmFallback",
    {"enabled": True}
)

driver = webdriver.Remote(
    "http://127.0.0.1:9515",  # LumaBrowser's W3C WebDriver server
    options=opts
)

# Existing test code — locators, assertions, waits — unchanged.
driver.find_element(
    By.CSS_SELECTOR, ".btn-primary",
    # Optional per-call hint that survives renames.
).click()
// connectOverCDP attaches to LumaBrowser unchanged.
import { chromium } from 'playwright';

const browser = await chromium.connectOverCDP(
    'http://127.0.0.1:9222'
);
const page = await browser.contexts()[0].newPage();

// Existing locators keep working.
await page.click('.btn-primary');

// Or call the Lumabyte CDP domain for a description-first locator.
const cdp = await page.context().newCDPSession(page);
await cdp.send('Lumabyte.click', {
    selector: '.btn-primary',
    description: 'the primary submit button under the form'
});
// puppeteer.connect attaches to the running LumaBrowser instance.
import puppeteer from 'puppeteer-core';

const browser = await puppeteer.connect({
    browserURL: 'http://127.0.0.1:9222'
});
const [page] = await browser.pages();

// Existing CSS clicks work as-is.
await page.click('.btn-primary');

// Description-first via the Lumabyte CDP domain.
const cdp = await page.target().createCDPSession();
await cdp.send('Lumabyte.click', {
    selector: '.btn-primary',
    description: 'the primary submit button under the form'
});

What you don't have to change

Self-healing is one capability flag. Everything else in your test stack — the parts you spent years building — keeps working.

Your test framework

pytest, JUnit, NUnit, Mocha, Jest, Cypress — whatever runs your suite today, keeps running it.

Your CI pipeline

GitHub Actions, GitLab, Jenkins, CircleCI, Buildkite. Same workflow files. Just install LumaBrowser before the test step.

Your locator strategies

CSS, XPath, link text, partial link text, tag name, data-testid. All standard W3C locators are accepted as-is.

Your fixtures and mocks

Page Object Models, conftest fixtures, network stubs, auth helpers. All client-side — the server doesn't see them.

Your assertions

Every assertion library and reporter you use. The fallback only changes how locators are resolved, not what comes back.

Your retry logic

If you wrap brittle steps in retries today, you'll need fewer of them — but the ones that remain still work.

The free option in a paid market

Self-healing was an enterprise SKU until very recently. Most teams that wanted it had to migrate off Selenium / Playwright entirely and onto a managed test platform. LumaBrowser is the path that doesn't require either.

Testim Mabl Perfecto Healenium (OSS) LumaBrowser
Pricing Free Community + paid tiers Custom quote, ~$450+/mo From ~$83/mo, 12-mo min Free (self-host) Free
Migration required Yes — new framework Yes — new framework Yes — new framework Wrap your driver, run a service No — one capability
Healing approach Smart Locators + confidence ML on run history AI + run history ML similarity LLM + DOM snapshot
Works with Selenium Their own SDK Their own SDK Their own SDK Java, Python, JS, C# Any language
Works with Playwright No No No Via proxy add-on Native via CDP
Works with Puppeteer No No No No Native via CDP

Pricing as listed by each vendor at time of publication; enterprise tiers on Mabl and Perfecto reach $40k+/year on annual contracts. Testim has a free Community tier with restricted runs and Healenium is fully open source — both are real options if you don't need self-healing across multiple drivers from a single tool. The LumaBrowser fallback is logged per-call so you can audit every hit and roll back to a strict CSS selector if you ever want to.

This comparison reflects publicly available pricing and feature information gathered to the best of our knowledge from each vendor's public materials. Vendors update plans frequently and we're a small team — if anything here looks wrong, please email [email protected] with the correction and a source, and we'll update the page.

Stack-specific deep dives

Each driver has a dedicated reference page with the full capability matrix, the supported subset of vendor extensions, and the migration FAQ. Open the one that matches your stack.

Stop losing sprint capacity to selector maintenance

LumaBrowser is free, plugs into the suite you already wrote, and runs locally on the same CI runners you already pay for. Add it once, set the capability flag, and the LLM does the locator triage your team has been doing by hand.

Download LumaBrowser — free Read the driver reference