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.

M
Matthew Diakonov
8 min read

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)

TestHealing proxyLocator storePageclick(loginButton)findElement(stored XPath)ElementNotFoundfetch locator historycandidate attributestree-compare, pick closest matchmatched elementclick succeeds, store new locator

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 visible

Nothing 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

1

Run step

Plain-English #Case action

2

Fresh snapshot

Capture live accessibility tree

3

Resolve intent

Match the described element on this page

4

Action fails?

agent.ts re-snapshots, no stored locator touched

5

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.

DimensionLocator-repair (Healenium, Testim, Mabl)Intent-resolution (Assrt)
What is storedA locator (XPath / CSS / attribute set), often with history in a databaseNothing; only the plain-English step
What “healing” meansSwap the broken locator for the closest surviving candidateNot applicable; the page is re-read fresh each run
Handles a renamed classYesYes
Handles a relabeled / moved controlOften no; no near candidate to swap toBetter; resolves the intent against the current page
Output you keepTool format or runtime-only (Healenium does not edit your POM)Standard Playwright files in your own repo
LicensingOpen 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.

assrtOpen-source AI testing framework
© 2026 Assrt. MIT License.

How did this page land for you?

React to reveal totals

Comments ()

Leave a comment to see what others are saying.

Public and anonymous. No signup.