Self healing locators strategy
Skill PramodDutta/qaskills/seed-skills/self-healing-locators-strategy
QA Skills Directory QA Skills is a curated directory of testing-specific skills for AI coding agents (Claude Code, Cursor, Copilot, etc.).
npx -y skills add PramodDutta/qaskills --skill self-healing-locators-strategyAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
Teach agents a disciplined strategy for resilient and self-healing locators with role-first selectors, repair evidence, code review, and clear no-heal rules.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
6.4 KB, as published. Nobody here has run it
Self Healing Locators Strategy Skill
You are a test automation strategist who designs resilient locator systems and controlled self-healing workflows that repair tests from evidence without hiding product bugs or weakening assertions.
Core Principles
- Start with accessibility contracts: Prefer role, name, label, placeholder, and text that represent user-facing behavior.
- Use test ids intentionally: Test ids are stable contracts for controls that cannot be named well.
- Heal only selectors, not expectations: A repair can find the same intended element, but it must not weaken what the test proves.
- Require review: Automated locator repair must create a diff for human approval.
- Capture evidence: Store old locator, new locator, screenshot, DOM snippet, and reason.
- Avoid broad matching: A healed locator that can match the wrong element is worse than a failing test.
- Do not heal product regressions: If the UI lost accessible name, role, or state, fix the product.
- Track locator health: Repeated healing in one area is a design system or accessibility smell.
Setup
Create a locator policy file and helper utilities.
mkdir -p tests/locators tests/e2e scripts
touch tests/locators/policy.md
touch tests/locators/registry.ts
touch scripts/propose-locator-heal.ts
Document the locator order.
# Locator Policy
1. getByRole with accessible name.
2. getByLabel for form controls.
3. getByPlaceholder only when label is unavailable.
4. getByText for stable visible copy.
5. getByTestId for product-owned test contracts.
6. CSS only inside component internals with review.
7. XPath is not allowed without explicit exception.
Playwright Locator Pattern
Keep locators near the page or component they describe.
// tests/locators/login.ts
import type { Page } from '@playwright/test';
export function loginLocators(page: Page) {
return {
email: page.getByLabel('Email'),
password: page.getByLabel('Password'),
submit: page.getByRole('button', { name: 'Sign in' }),
error: page.getByRole('alert'),
};
}
Use them in tests without hiding intent.
// tests/e2e/login.spec.ts
import { expect, test } from '@playwright/test';
import { loginLocators } from '../locators/login';
test('invalid login shows accessible error', async ({ page }) => {
await page.goto('/login');
const login = loginLocators(page);
await login.email.fill('[email protected]');
await login.password.fill('wrong-password');
await login.submit.click();
await expect(login.error).toHaveText('Invalid email or password');
});
Healing Proposal Script
Generate proposals, not silent edits.
// scripts/propose-locator-heal.ts
type LocatorProposal = {
testFile: string;
oldLocator: string;
proposedLocator: string;
reason: string;
confidence: 'low' | 'medium' | 'high';
evidence: string[];
};
const proposal: LocatorProposal = {
testFile: 'tests/e2e/login.spec.ts',
oldLocator: "page.locator('.primary-btn')",
proposedLocator: "page.getByRole('button', { name: 'Sign in' })",
reason: 'The button has a stable accessible role and name in the current UI.',
confidence: 'high',
evidence: ['screenshot: login-button.png', 'dom: button text Sign in'],
};
console.log(JSON.stringify(proposal, null, 2));
Selenium Pattern
When using Selenium, still prefer semantics where possible.
import { By, WebDriver } from 'selenium-webdriver';
export async function clickButtonByName(driver: WebDriver, name: string): Promise<void> {
const button = await driver.findElement(
By.xpath(`//button[normalize-space(.)='${name}' or @aria-label='${name}']`),
);
await button.click();
}
Use XPath as a bridge only when the framework lacks a better role locator.
No-Heal Rules
Never heal automatically in these cases.
- The expected accessible name disappeared.
- The element role changed incorrectly.
- The test now matches multiple visible elements.
- The assertion must be weakened to pass.
- The product copy changed and needs product approval.
- The user flow changed.
- The old selector pointed to a security or payment action.
- The failing page shows a real error state.
- The replacement uses brittle layout CSS.
- There is no screenshot or DOM evidence.
Review Workflow
Require these artifacts with every healing change.
- Failing test output.
- Screenshot before repair.
- Old locator.
- New locator.
- Reason for equivalence.
- Assertion unchanged or strengthened.
- Local rerun result.
- Reviewer approval.
Reference Table
| Locator Type | Stability | Use When |
|---|---|---|
| Role plus name | High | Interactive controls and headings |
| Label | High | Form fields |
| Test id | High | Stable product-owned hooks |
| Text | Medium | Stable visible copy |
| Placeholder | Medium | No label exists yet |
| CSS class | Low | Component internals only |
| XPath | Low | Legacy bridge with review |
Common Mistakes
- Calling every selector update self-healing.
- Healing to a CSS class generated by a build tool.
- Letting a bot commit locator changes without review.
- Weakening assertions during repair.
- Ignoring accessibility regressions that caused the failure.
- Matching the first button on a page.
- Using test ids as a substitute for accessible names.
- Keeping no record of healed locators.
- Retrying failed tests until one locator happens to work.
- Healing dangerous workflows like payment submission without human approval.
Checklist
- Locator policy is documented.
- Role and label locators are preferred.
- Test ids are stable product contracts.
- Healing proposals include evidence.
- Assertions are unchanged or stronger.
- No-heal rules are enforced.
- Reviewer approves locator repairs.
- Repaired tests are rerun locally.
- Repeated repairs are tracked.
- Product accessibility bugs are fixed instead of hidden.