The page moved on.
Your suite doesn't have to.
TAMASH-Selenium is plug-and-play self-healing for Selenium. Wrap your WebDriver once and every findElement through it — in Page Objects, @FindBy fields, helper layers, inside a wait — recovers when a locator breaks. Rule-based and free by default; point it at an AI model only if you want to.
How It Works
One wrapped driver. No new framework.
Your tests run exactly as you wrote them. TAMASH-Selenium only steps in the moment a locator would otherwise throw.
A locator fails
The app shipped a change — an id got regenerated, a button moved — and findElement throws, even though the page still works fine for real users.
The element is found
TAMASH captures an accessibility-tree snapshot of the live page and matches your intent against it — with the built-in rule-based matcher, or an AI provider if you configured one.
Heal and continue
The match is converted into a durable By — id, name, data attribute, link text, then structural XPath — cached for the rest of the run, and logged in an HTML report.
Quick Start
One line to switch it on
Same self-healing behavior in both languages, native to how you already write Selenium tests.
Java
Maven Central · Java 21+ · Selenium 4.6+
<dependency>
<groupId>com.vibetestq.qtpsudhakar</groupId>
<artifactId>tamash-selenium</artifactId>
<version>0.2.0</version>
</dependency>
import com.vibetestq.qtpsudhakar
.tamash.SelfHealingDriver;
WebDriver driver =
SelfHealingDriver.wrap(myDriver);
Working example
Python
PyPI · Python 3.9+ · pytest, Behave, unittest
pip install tamash-selenium
from selenium import webdriver
from tamash_selenium import (
SelfHealingDriver)
driver = SelfHealingDriver.wrap(
webdriver.Chrome())
Working example
That one wrap covers everything downstream — Page Objects, @FindBy fields, utility layers, and elements resolved inside a WebDriverWait. No test rewrite, no new API to learn.
Framework Support
Fits the runner you already use
Hook it in the way each framework expects — an annotation, a base class, a fixture, or a glue package.
JUnit 5
Add the @UseTamashSelenium annotation to your test class and the driver is wrapped and tracked per test.
TestNG
Extend TamashSeleniumTestNgTest — setup, teardown, and per-test attribution are handled for you.
Cucumber (Java)
Point Cucumber at the bundled glue package and every scenario picks up healing automatically.
pytest
The plugin auto-loads on install — request the driver or tamash_driver fixture and start writing steps.
pytest-bdd & Behave
pytest-bdd uses the same fixtures; Behave wires in through the hooks in tamash_selenium.integrations.behave.
unittest & custom runners
Extend TamashSeleniumTestCase, or call CurrentTest.set(…) yourself from any runner you've built.
Beyond Runtime Healing
Fix it once, not every run
A runtime heal keeps today's run green. Writing the fix back into your source is what stops the same locator from costing you again next week.
apply-heals CLI
Turns a runtime heal into a permanent source change — a surgical edit to the locator that actually broke, so the next run needs no healing at all.
HTML step reports
Every run writes a report to TAMASH_REPORT: each step, which locators healed, what they healed to, and which provider did it. Nothing happens invisibly.
Action recovery
Sometimes the element is found but the click isn't landing. Optional action recovery scrolls, waits, and re-dispatches instead of failing on a covered or off-screen element.
Implicit wait pinned to zero
Implicit waits and explicit waits don't mix. TAMASH pins the implicit wait to 0 by default so your WebDriverWait behaves predictably — override it with TAMASH_KEEP_IMPLICIT_WAIT if you must.
Healing Providers
Start free. Add AI only if you need it.
Providers are selected with the HEALER_PROVIDER environment variable, typically loaded from a .env file.
Default — no key, no network, no tokens
tamash — rule-based
Matches your locator's intent against the page's own accessibility tree. No API key, no subscription, no network call, no token cost. Never guesses — it declines rather than risk a wrong heal.
Bring your own API key
Ollama
Free, runs locally (or Ollama Cloud) — a good step up from rule-based without a bill.
OpenAI
Requires an OpenAI API key.
Anthropic
Requires an Anthropic API key.
Gemini
Requires a Google Gemini API key.
Already have a subscription? No API key needed
Claude subscription
Uses your existing Claude plan via claude-subscription.
GitHub Copilot subscription
Uses your Copilot seat via copilot-subscription (Python 3.11+).
Configuration
Environment variables, nothing else
No config class to extend, no YAML to maintain. Set what you need; every default is sensible on its own.
| Variable | What it does | Example |
|---|---|---|
HEALER_PROVIDER |
Chooses the healing strategy. | tamash (default) |
HEALER_ENABLED |
Turns healing off globally — useful for verifying that a fix works on its own. | false |
HEALER_ASSERTIONS |
How an assertion failure is treated when healing was involved. | warn / strict |
HEALER_ACTION_RECOVERY_ENABLED |
Recovers blocked actions by scrolling, waiting, and re-dispatching. | true |
TAMASH_KEEP_IMPLICIT_WAIT |
Keeps your implicit wait instead of pinning it to 0. | true |
TAMASH_REPORT |
Where the HTML step report is written. | target/tamash-report.html |
The Python package adds a few more for driver management — TAMASH_BROWSER, HEADLESS, TAMASH_REUSE_DRIVER, HEALER_PARALLEL, and TAMASH_ACTION_TIMEOUT_MS. Full reference in the docs.
Why Teams Switch
Free to use — including commercially
Apache 2.0 licensed. Most Selenium suites in the wild are years old and full of locators nobody wants to touch. This is for those suites.
Stock Selenium
- A regenerated id or moved button breaks the locator
- The test fails even though the app works fine for users
- Someone has to notice, reproduce, and hand-fix the selector
- No record of which locators are quietly fragile
With TAMASH-Selenium
- One wrapped driver covers the whole suite — no test rewrite
- Heals and continues when the element is genuinely there
- Fails normally when it isn't — it declines rather than guess
- A durable selector is derived, not another brittle XPath
- Every heal logged in an HTML report, with attribution
-
apply-healswrites the fix back into your source, permanently
Samples & Support
See it wired into a real suite
Runnable samples for both languages, full documentation, and a direct line for anything else.
Sample Implementations
Page Object Model suites against OrangeHRM — Java with JUnit 5, TestNG, and Cucumber; Python with pytest, pytest-bdd, Behave, unittest, and data-driven styles.
Java samplePython sample
Documentation
Installation, framework wiring, the full configuration reference, provider setup, and the apply-heals workflow — all in one place.
Read the docsBugs & Support
Raise bugs and feature requests on the repository that matches your language, or email us directly for anything that doesn't fit an issue.
Open an issuesupport@vibetestq.com
Your Selenium suite isn't legacy.
It just needs to survive the next release.
Install it for free in Java or Python, wrap your driver, and point it at the locators that keep breaking.