Chrome extension for test automation

Anchor to what doesn't change.

Anchor Locator lets you build locators from the element you trust. Pick any stable element on the page as your anchor, and get readable XPath that keeps working when IDs and classes change.

  • Page data never leaves your browser
  • No ads
  • No tracking
Anchor Locator · XPath axes
✗
//*[@id='input-423']Generated ID. It's input-871 after the next build, so this matches nothing.
✓
//label[normalize-space(.)='Email']/following::input[1]Anchored on the visible "Email" label. Still finds the field.
✗
(//button[normalize-space(.)='Add to cart'])[2]Index-based. Reorder the cards and it clicks a different plan.
✓
//h3[normalize-space(text())='Team plan']/following-sibling::button[1]Anchored on the "Team plan" card title. Follows the card.
Free-select anchor

Pick the target. Then pick any element as the anchor.

You know which parts of your app stay stable. Anchor Locator lets you make the call, then writes the XPath axes between the two elements for you.

  1. Click your target TARGET

    Open Anchor Locator in DevTools and click the element your test needs.

  2. Click your anchor ANCHOR

    Pick any element on the page as the anchor. A stable one near the target or related to it works best: a field label, a card title, a heading.

  3. Copy your locator

    Get readable, axes-based XPath. Or record the whole flow with the Recorder and export it to Playwright, Selenium or Cypress.

Resilient XPath, generated for you

Built on what users see.

Locators lean on visible, meaningful elements instead of generated IDs and hashed classes. Click the Email field, then its label, and you get:

//label[normalize-space(.)='Email']/following::input[1]
  • following::input[1] means the first input after the label, so an extra wrapper div or inserted hint text doesn't break it.
  • normalize-space() ignores stray whitespace and line breaks in the label text.
Email input selected as the target and the Email label as the anchor, with the axes XPath underneath
Any element, your call

Re-pick the anchor, get a new locator.

Not happy with the anchor? Pick a different one. Same Email field, but anchored on the "Password" label this time, so the XPath walks backwards with preceding:::

//label[normalize-space(text())='Password']/preceding::input[1]
  • Following, preceding, sibling and ancestor relationships are built for you instead of typed by hand and re-tested in the console.
  • You see the exact XPath, so you can commit it, review it and own it.
The same Email target with the Password label picked as the anchor, producing a preceding axis XPath
Survives UI refactors

Your UI changed. Your locator didn't need to.

On our demo page, the next build regenerates IDs (input-423 becomes input-871), adds a wrapper and inserts hint text between the label and the field. The ID locator finds nothing. The label-anchored XPath still finds the Email field.

  • Same axes XPath, same field, both versions.
  • Check it yourself with $x() in the DevTools console.
Before and after a rebuild: the same axes XPath finds the Email field in both versions while its ID changes from input-423 to input-871
Anchor on meaning, not position

Identical buttons, one meaningful anchor.

Three cards, three "Add to cart" buttons. An index like (//button[normalize-space(.)='Add to cart'])[2] points at whatever ends up second. Anchor on the card title instead, and the locator follows the card when they're reordered:

//h3[normalize-space(text())='Team plan']/following-sibling::button[1]
Card grid with the Team plan heading as the anchor and its Add to cart button as the target
Why Anchor Locator

Locators you can read, review and trust

⚓

You choose the anchor

Click your target, then any element as the anchor. You know what stays stable in your app.

⤳

Axes-based XPath

following::, following-sibling::, preceding:: and ancestor:: with normalize-space(), generated for you.

👁

Deterministic and readable

The XPath says exactly what it does. Nothing changes behind your back.

●

Recorder with assertions

Capture a flow, including visible, text, value and attribute assertions.

⇪

Export to your framework

Playwright (TypeScript), Selenium (Java, Python, C#) and Cypress.

🔒

Private by design

Runs locally. Page data never leaves your browser. No ads, no tracking, no analytics.

The Recorder

Record a flow. Export a script.

Record a flow, including assertions, and export it as Playwright TypeScript. Prefer Selenium or Cypress? Same recording, one click. Each export follows its framework's conventions:

  • Playwright uses its built-in getBy… locators with an XPath fallback.
  • Selenium uses axes-based XPath.
  • Cypress uses CSS selectors through cy.get and cy.contains, with no plugin to install.

Change the anchor on any step Coming in v1.1

The Recorder picks an anchor for each step. Don't like it? Use Select Anchor on that step, in the main panel or the expanded view. Both stay in sync.

Playwright TypeScriptSelenium Java · Python · C#Cypress

Try it free for 10 recorded steps, with every Recorder feature and all three export formats included. Pro unlocks unlimited steps.

Recorder panel showing a recorded flow exported as Playwright TypeScript
// Exported by Anchor Locator (Playwright, TypeScript) import { test, expect } from '@playwright/test'; test('recorded test', async ({ page }) => { await page.getByLabel("Email").fill("kent@quillfern.test"); await page.getByLabel("Password").fill(process.env.PASSWORD ?? ''); // •••••••• await page.locator("xpath=//h3[normalize-space(text())='Team plan']/following-sibling::button[1]").click(); await expect(page.getByRole("heading", { name: "Team plan" })).toContainText("Team plan"); });

Playwright uses getBy… locators where they're unique; where they aren't, your anchor XPath.

Pricing

Free for every locator feature

Only the Recorder has a limit. Try it with 10 free steps, then go Pro for unlimited recording.

Free

Everything you need to build locators.

$0forever
  • Free-select anchor: any element
  • Axes-based XPath generation
  • Recorder: 10 free steps (lifetime total)
  • Assertions included (they count as steps)
  • Export to Playwright, Selenium and Cypress
  • Everything you record stays exportable
Add to Chrome — it's free

Pro Monthly

Unlimited Recorder steps, cancel any time.

$8/ month
  • Everything in Free
  • Unlimited Recorder steps
  • Up to 3 browsers per license
  • Works offline up to 7 days between license checks
  • 14-day refund, no questions asked
Get Pro Monthly
Compare plansFreePro
Price$0$8/month or $49 lifetime
Free-select anchor (any element)✓✓
Axes-based XPath✓✓
Recorder steps10 free steps (lifetime total)Unlimited
Assertions (visible, text, value, attribute)✓ count as steps✓
Export to Playwright, Selenium, Cypress✓ included✓
Everything you've recorded stays exportable✓✓
Future Pro features✕✓ Lifetime includes every future Pro feature
Refunds✕Within 14 days, no questions asked
Works offline✓Up to 7 days between license checks
BrowsersNo limitUp to 3 browsers per license
No ads, no tracking✓✓
Prices in USD. Any applicable tax is calculated at checkout. Payments processed by Lemon Squeezy, our merchant of record. Refund policy
FAQ

Questions, answered

Is it really free?

Yes. Every locator feature is free, including free-select anchor and axes-based XPath. The Recorder comes with 10 free steps to try it, with export to Playwright, Selenium and Cypress included. Pro unlocks unlimited Recorder steps.

What happens after the 10 free Recorder steps?

The 10 free steps are a lifetime total, not a per-recording allowance, and the count doesn't reset between recordings. Once you've used them, the Recorder stops adding new steps. Everything you've recorded stays in the extension and can still be exported to Playwright, Selenium or Cypress. All locator features keep working as normal. Upgrade to Pro for unlimited Recorder steps.

What counts as a step?

Each action you record counts as one step, like a click, filling a field or choosing an option. Assertions (element visible, text, value, attribute) count as steps too. After 10 steps, recording new steps needs Pro.

Monthly or lifetime: which should I pick?

$8/month suits trying Pro on a project, and you can cancel any time. $49 lifetime is one payment, about six months of the monthly price. Lifetime includes every future Pro feature.

Can I get a refund?

Yes. Full refund within 14 days of purchase, no questions asked, on both Pro plans. See the refund policy.

How is payment handled?

Payments are handled by Lemon Squeezy, our merchant of record, so your payment details go to Lemon Squeezy and never to us. After checkout you activate Pro in the extension with your license key.

What happens to my recordings if Pro ends?

You keep them, and everything you've recorded stays exportable. New steps need an active Pro plan.

Which frameworks can I export to, and what locators do they use?

Playwright (TypeScript), Selenium (Java, Python, C#) and Cypress. Each export follows its framework's conventions. Selenium uses axes-based XPath. Playwright uses its built-in getBy… locators with an XPath fallback. Cypress uses CSS selectors through cy.get and cy.contains, so there's no XPath plugin to install. The Recorder picks locators automatically, and you can change any step's anchor yourself, with the same free-select flow as the locator panel.

What about privacy?

The extension runs locally and page data never leaves your browser. There are no ads, no tracking and no analytics. The only network call is a license check with Lemon Squeezy, and only for Pro users. Details are in the privacy policy.

Why does it ask for access to all sites?

The extension requests scripting, storage and access to all sites. All-sites access is what lets it build locators and record on whichever page you're testing, since that could be any URL. Storage keeps your recordings and settings in your browser (the free-step counter also syncs through Chrome Sync, if you use it).

Playwright recommends role-based locators. Why XPath?

When role and test-id locators are available, use them (Playwright exports from the Recorder do). The locator panel is for when they aren't: icon buttons with no text, clickable divs, vendor widgets, and apps without test IDs.

How do I get help?

Email kedveneilrabe@gmail.com and we'll get back to you.

Pick the anchor. Keep the locator.

Anchor Locator is free on Chrome. Page data never leaves your browser. No ads.