Test automation reference
Self-healing test tools, compared by how they actually heal
Every list of self-healing test tools ranks the same names and tells you each one “fixes broken tests automatically.” None of them tells you the part that matters: what gets healed. Once you look at the mechanism, the category splits cleanly in two, and one of those halves does not heal anything because it never stores a locator to break.
Direct answer · verified 2026-06-16
Self-healing test tools fall into two families. Locator-repair tools (Healenium, Testim, Mabl, testRigor, AccelQ) store an element locator and, when it stops matching, search the page for the closest surviving candidate and swap it in. Intent-resolution tools (Assrt) store no locator at all; they re-resolve each step against a fresh accessibility tree on every run, so there is nothing stored to break. Mechanism, not the brand, is what decides which UI changes a tool survives.
Healenium’s own documentation describes its runtime locator-store healing at healenium.io.
Family one: repair the stored locator
This is what most people mean by “self-healing.” The tool keeps a record of how to find each element. When a locator stops matching, it does not give up; it looks at the live DOM and picks the element that most closely resembles the one it remembers, then substitutes that locator and continues.
Healenium is the clearest open-source example. It sits as a proxy in front of the real Selenium driver and intercepts every findElement call. It records each locator’s ID, CSS, XPath, tag, class, and text in a PostgreSQL store. When a locator throws ElementNotFound, a tree-comparison algorithm scores DOM candidates against that stored history and picks a replacement. Commercial low-code tools (Testim, Mabl) do a similar thing without a database you manage: they capture many attributes per element at record time and re-rank them at runtime so one broken attribute does not sink the lookup.
The strength is predictability. The healed locator is a real locator you could inspect. The limit is also structural: a fallback only works when a close-enough candidate still exists on the page. Rename a class and it heals. Split one screen into two steps, or relabel a button so its meaning changes, and there is no neighbor to swap to.
Locator-repair healing at runtime (Healenium-style)
Family two: store no locator at all
The second family removes the thing that breaks. Instead of recording a locator and repairing it later, the test is written as intent, in plain English, and resolved against the live page every single run. There is no stored XPath, no attribute set saved in a database, and therefore no locator to rot between releases. “Healing” stops being a feature because the failure mode it patches never occurs.
Assrt is built this way. You describe a flow as a #Case block of plain steps, and the runner resolves each step against a fresh accessibility tree at execution time:
#Case 1: Checkout with a saved card
- Click the Cart button
- Click Proceed to checkout
- Verify the Place order button is visible
- Click Place order
- Verify the text "Order confirmed" is visibleNothing in that block names a selector. “Click the Cart button” is resolved at run time by reading what is actually on the page, not by replaying a locator captured weeks ago. When the Cart button moves, gets a new class, or shifts into a different container, the next run simply reads the new tree and finds it again.
The anchor: there is no locator store in the source
You can verify the “nothing to heal” claim in Assrt’s own code rather than taking it on faith. In the open-source runner at src/core/agent.ts, the agent is instructed to capture a fresh snapshot of the accessibility tree before each interaction and to use the element refs from that snapshot, never a persisted selector. Then, in the catch block around lines 1069 to 1077, any time an action fails the code immediately calls this.browser.snapshot() again and feeds the fresh accessibility tree back to the model with the instruction to “try a different approach.”
Compare the two designs directly. Healenium’s recovery path ends in a write to its locator store (it persists the new locator for next time). Assrt’s recovery path ends in a fresh read of the page and a re-decision. One repairs stored state; the other has no stored state to repair. That single architectural difference is why the “self-healing” vocabulary, which is entirely about patching a remembered locator, does not map onto the second family at all.
Assrt's recovery path: re-read, re-decide, continue
Run step
Plain-English #Case action
Fresh snapshot
Capture live accessibility tree
Resolve intent
Match the described element on this page
Action fails?
agent.ts re-snapshots, no stored locator touched
Re-decide
Pick a different element from the new tree
One more consequence of having no proprietary store: what Assrt produces is standard Playwright. The generated tests are real .spec.ts files you commit to your own repository and run in any CI. There is no database that owns your suite and no format you would have to export out of if you left.
The two families, side by side
This is the lens the ranked lists skip. Sort by the mechanism, not the logo, and the trade-offs become legible.
| Dimension | Locator-repair (Healenium, Testim, Mabl) | Intent-resolution (Assrt) |
|---|---|---|
| What is stored | A locator (XPath / CSS / attribute set), often with history in a database | Nothing; only the plain-English step |
| What “healing” means | Swap the broken locator for the closest surviving candidate | Not applicable; the page is re-read fresh each run |
| Handles a renamed class | Yes | Yes |
| Handles a relabeled / moved control | Often no; no near candidate to swap to | Better; resolves the intent against the current page |
| Output you keep | Tool format or runtime-only (Healenium does not edit your POM) | Standard Playwright files in your own repo |
| Licensing | Open source (Healenium) to closed commercial (Testim, Mabl) | Open source and free |
How to choose, honestly
Locator-repair tools win when you already have a large Selenium suite and you do not want to rewrite it. Healenium drops in front of your existing driver and cuts the day-to-day “a class changed and now forty tests are red” tax without you touching the test code. If your investment is in Selenium and your changes are mostly cosmetic, that is the lower-friction path and you should take it.
Intent-resolution wins when you are starting fresh, when your UI changes are structural rather than just renamed classes, or when you refuse to let a vendor database hold your suite. You write intent, you keep real Playwright code, and you remove the entire class of “stale locator” failures rather than automating their repair. The honest caveat: any tool, in either family, fails when the described action no longer exists in the product. No mechanism heals a feature you deleted.
Want to see the no-locator approach on your own app?
Bring a flow that keeps breaking on UI changes and we will run it against a fresh accessibility tree, live.
Frequently asked questions
What does a self-healing test tool actually do?
It keeps a test passing after the UI changes without a human editing the test. There are two mechanisms behind that promise. Locator-repair tools store an element locator (an XPath, CSS selector, or weighted set of attributes) and, when that locator stops matching, search the DOM for the closest surviving candidate and swap it in. Intent-resolution tools store no locator at all; they re-resolve each step against the live page on every run, so there is no stored locator to break in the first place.
Which tools are considered self-healing?
The commonly listed ones are Healenium (an open-source proxy in front of Selenium that stores locators in PostgreSQL and swaps a fallback on ElementNotFound), Testim and Mabl (commercial low-code tools that weight multiple element attributes and re-rank them at runtime), testRigor (plain-English steps resolved by its engine), and AccelQ. Assrt belongs to the second family: it runs plain-English #Case steps against a fresh accessibility tree each run, so nothing is stored to heal.
How is Healenium's healing different from Assrt's?
Healenium intercepts every findElement call, records the locator (ID, CSS, XPath, tag, class, text) in a PostgreSQL store, and when a locator throws ElementNotFound it runs a tree-comparison algorithm against the stored history to pick a replacement. The locator and its history are the thing being healed. Assrt never records a locator between actions: agent.ts captures a fresh accessibility-tree snapshot before each step and again on any failure, so there is no stored locator and no history to repair.
Is self-healing the same as flaky-test retries?
No. A retry re-runs the exact same step with the exact same locator and hopes timing was the problem. Self-healing changes what the step targets. Locator-repair tools change it by substituting a new locator; intent-resolution tools change it by re-reading the page and re-deciding which element matches the described intent. A retry never updates the target, which is why a real UI change defeats it.
Do self-healing tools produce code I can keep?
It depends on the family. Most locator-repair and low-code tools keep the test in their own format or database; Healenium, for example, explicitly does not modify your Page Object files, it heals only at runtime. Assrt generates standard Playwright files you commit to your own repository and run in any CI. There is no proprietary format and no vendor database holding your suite hostage.
When does locator-repair self-healing still break?
When the change is structural rather than cosmetic. Renaming a class or shifting a node a level deeper is the easy case a fallback locator handles. Splitting one page into two steps, moving a control behind a new modal, or relabeling a button so its meaning changes are cases where there is no nearby surviving candidate to swap to. Intent-resolution handles relabeling better because it reads the current page fresh, but any tool will fail when the described intent no longer exists in the product.
Is Assrt free and open source?
Yes. Assrt is open source and free to run yourself. You install it with npx @m13v/assrt, point it at your app, and it discovers scenarios and generates Playwright tests locally. There is no per-seat or per-test pricing and no cloud dependency required to run your suite.
Keep reading
Self-healing tests guide
The category above selector patching: tests as prose, resolved against a fresh accessibility tree.
Automated self-healing tests
What automation actually removes when the tool stores no locator to begin with.
Self-healing test maintenance hours
Where the maintenance hours go, and which family of tools actually claws them back.
Comments (••)
Leave a comment to see what others are saying.Public and anonymous. No signup.