AI-powered self-healing pytest plugin for Playwright โ automatically fixes broken selectors using LLM reasoning
Project description
๐ฉบ Self-Healer
AI-powered self-healing pytest plugin for Playwright โ automatically detects broken selectors in your tests and uses LLM reasoning to suggest (and optionally apply) fixes.
โจ What It Does
When a Playwright test fails because a CSS selector or XPath no longer matches an element:
- Detects the broken selector and extracts the relevant DOM context
- Reasons about what the selector was supposed to do (using Groq/LLM)
- Suggests a corrected selector with confidence score
- Shows a rich TUI panel with the suggestion
- Applies the fix directly to your source code (with your approval!)
All of this happens automatically โ just install and run your tests.
๐ Quick Start
Step 1: Install
pip install self-healer
playwright install chromium
Step 2: Set Environment Variables
# Required
export GROQ_API_KEY="gsk_your_api_key_here"
# Optional (these have defaults)
export GROQ_BASE_URL="https://api.groq.com/openai/v1"
export SELF_HEAL_MODEL="llama-3.3-70b-versatile"
export SELF_HEAL_TEMPERATURE="0.4"
On Windows (PowerShell):
$env:GROQ_API_KEY = "gsk_your_api_key_here"
Step 3: Add to your conftest.py
# conftest.py
import pytest
from playwright.sync_api import sync_playwright
from self_healer import enable_healing
@pytest.fixture(scope="session")
def browser_instance():
with sync_playwright() as p:
browser = p.chromium.launch(headless=False)
yield browser
browser.close()
@pytest.fixture(scope="function")
def page(browser_instance):
pg = browser_instance.new_page()
enable_healing(pg) # โ Enable self-healing
pg.goto("https://your-app.com")
yield pg
pg.close()
Step 4: Write Tests (normal Playwright)
# tests/test_login.py
from playwright.sync_api import Page
def test_login(page: Page):
page.fill("#user-name", "admin")
page.fill("#password", "secret")
page.click("#login-button")
assert "dashboard" in page.url
Step 5: Run
pytest -v -s
If #login-button changes to #btn-login, the agent will:
- Detect the failure
- Analyze the live DOM
- Suggest
#btn-loginwith high confidence - Ask you to Accept, Reject, or Copy the fix
โ๏ธ Configuration
All configuration is via environment variables โ no config files needed.
| Variable | Required | Default | Description |
|---|---|---|---|
GROQ_API_KEY |
โ | โ | Your Groq API key |
GROQ_BASE_URL |
โ | https://api.groq.com/openai/v1 |
API endpoint URL |
SELF_HEAL_MODEL |
โ | llama-3.3-70b-versatile |
LLM model name |
SELF_HEAL_TEMPERATURE |
โ | 0.4 |
LLM temperature (0.0โ1.0) |
๐๏ธ How It Works
Test Fails (broken selector)
โ
โผ
โโโโโโโโโโโโโโโโโโโ
โ Detect Failure โ pytest hook intercepts the error
โโโโโโโโโโฌโโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโ
โ DOM Extractor โโโโโโถโ XPath Builder โ (for dynamic sites)
โโโโโโโโโโฌโโโโโโโโโ โโโโโโโโโโฌโโโโโโโโโโ
โ โ
โโโโโโโโโโโโโฌโโโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโ
โ LLM Reasoning โ Groq / LLaMA analyzes intent + DOM
โโโโโโโโโโฌโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโ
โ File Locator โ Finds the exact file:line of the selector
โโโโโโโโโโฌโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโ
โ Human Approval โ Rich TUI: Accept / Reject / Copy
โโโโโโโโโโฌโโโโโโโโโโ
โผ
โโโโโโโโโโโโโโโโโโโโ
โ Apply Fix โ Edits the source file + opens editor
โโโโโโโโโโโโโโโโโโโ
๐ฆ For Package Developers
Building from source
git clone https://github.com/your-username/self-healer.git
cd self-healer
pip install build
python -m build
Publishing to PyPI
# Test on TestPyPI first
pip install twine
twine upload --repository testpypi dist/*
# Then publish to real PyPI
twine upload dist/*
Running the example project
pip install -e .
playwright install chromium
export GROQ_API_KEY="gsk_..."
pytest examples/saucedemo/tests/ -v -s
๐ค Contributing
Contributions are welcome! Please open an issue or pull request.
๐ License
MIT License โ see LICENSE for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file self_healer-0.1.1.tar.gz.
File metadata
- Download URL: self_healer-0.1.1.tar.gz
- Upload date:
- Size: 23.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b7754455fc6776c8762ba5c7dbf68e59924ff44efe13a0e60ac561fd38737834
|
|
| MD5 |
7abe2bdd3dc1520fbca229e162a9fbe6
|
|
| BLAKE2b-256 |
34fbd73b7e426efe7c9d56ce4e94bf9d7869e99129cad850f363d3dc4ef3dd5d
|
File details
Details for the file self_healer-0.1.1-py3-none-any.whl.
File metadata
- Download URL: self_healer-0.1.1-py3-none-any.whl
- Upload date:
- Size: 31.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.6 {"installer":{"name":"uv","version":"0.10.6","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f0059ce399832ed0f9beb0f8d842fe385fc5fdc003f3fc945c875d7171e5954
|
|
| MD5 |
7636bb212c26429b8bc55413d62599f1
|
|
| BLAKE2b-256 |
d7b0fbb3c49fd021873fc5c5572eca4bf2ce566ee8a635a32c6264411357c77d
|