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.
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.
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.
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.
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.
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'
});
Self-healing is one capability flag. Everything else in your test stack — the parts you spent years building — keeps working.
pytest, JUnit, NUnit, Mocha, Jest, Cypress — whatever runs your suite today, keeps running it.
GitHub Actions, GitLab, Jenkins, CircleCI, Buildkite. Same workflow files. Just install LumaBrowser before the test step.
CSS, XPath, link text, partial link text, tag name, data-testid. All standard W3C locators are accepted as-is.
Page Object Models, conftest fixtures, network stubs, auth helpers. All client-side — the server doesn't see them.
Every assertion library and reporter you use. The fallback only changes how locators are resolved, not what comes back.
If you wrap brittle steps in retries today, you'll need fewer of them — but the ones that remain still work.
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.
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.
W3C WebDriver server on port 9515. Same URL as ChromeDriver. Locator strategies, capabilities, and CDP commands all documented.
Attach chromium.connectOverCDP to port 9222. Auto-wait, locators, and the Network domain all keep working. Codegen caveat documented.
Drop the bundled Chromium. puppeteer.connect({ browserURL }) attaches over CDP. Full Page, Runtime, DOM, Network, Fetch support.
The full driver matrix on one page. Useful when your team owns multiple test suites and needs to know which capabilities each one gains.
Compare all three →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.