Your e2e tests stop breaking.

Record the flow. The extension lists every element missing a stable data-testid. Your dev knows exactly what to add, your Playwright and Cypress tests survive the next refactor.

Built for teams running Playwright or Cypress. Coming soon to the Chrome Web Store.

app.yourcompany.com/settings
Settings
Personal info
Marie Lambert <input> · Solid 95 · has name="fullname" All OK - skipped
marie@acme.io <input type="email"> · Usable 60 · has placeholder
REC Paused
Login flow
Steps 0 1 2
Pages1
Skip solid elements
Stop
View results →

Your e2e tests break every sprint. Not by accident.

Not because Playwright or Cypress changed. Because your selectors were never stable. And paving the way costs. Today, you're stuck with two bad options.

Live with fragile selectors

  • Sprint NPlaywright test green with an nth-child or CSS path - you merge
  • Sprint N+3A dev refactors the component. Test breaks on the next CI run
  • +1hReopen DevTools, build a new equally-fragile selector, re-merge
  • ×12Multiplied by every test that breaks at every release
  • Monday mornings burned fixing what worked Friday. The e2e suite turns into the chore nobody wants to own.

Prep each flow by hand

  • 1hFor every flow you want to automate, open DevTools on every clicked element
  • 30′Spot the elements with no data-testid, propose a clean name for each
  • 1dSplit into multiple tickets - the code lives in 5 components, so 5 different devs
  • +daysTrack 5 PRs, nudge the slow ones
  • 1 to 2 days per flow, just to pave the way. Before writing your first test line.

With TestID Hunter, you record the flow. The extension lists every Weak element with a suggested data-testid, scoped to the component. The ticket is ready in 5 minutes - the dev sees exactly what to add and where.
Robust e2e tests by default. No more back-and-forth, no more burned Mondays, no more selectors that die at the next refactor.

Three steps. That's the whole thing.

No setup. No SaaS. No backend. Install the extension, start recording.

1

Record

Sign up
jane@acme.io
REC
Steps5
Pages2
Stop

Click through your app like a user. Every click, every input, every navigation is captured with a screenshot, a bounding box, and a DOM snapshot.

2

Analyze

Page 1 · 4 elements
1 <input> email-input-text Solid
2 <button> continue-button Usable
3 <div> card-action-link Weak
4 <span> close-icon-span Weak

Every element is automatically scored. Focus only on the Weak ones - the rest is already safe to target.

3

Export

testid-ticket.zip
 testid-ticket-signup.zip
┣━━  report.md
┗━━  screenshots/
    ┣━━ element-01-email-input.png
    ┣━━ element-02-continue-btn.png
    ┣━━ viewport-03-card-link.jpg
    ┗━━ page-01.png

Download a ZIP with annotated screenshots and a ready-to-paste Markdown ticket. Or copy-paste straight into Jira / GitHub / Linear / Redmine.

The magic is in how we rank selectors.

A QA's job isn't to find any selector. It's to find selectors that don't break at the next sprint. We do that for you.

Solid score 90-100

Rock solid for test automation

  • data-testid present
  • Stable id
  • aria-label available

Nothing to do - the selector won't break. And yes, aria-label ranks just as Solid as data-testid - you win on testability and accessibility.

Usable score 50-89

Works today, fragile tomorrow

  • name, placeholder
  • role + text content
  • title attribute

Works. Will break if copy or structure changes.

Weak score 10-49

Will break on next refactor

  • CSS path / nth-child
  • Auto-generated UUID id
  • No stable attribute

We suggest a data-testid and put it in the ticket.

Live feedback

See the verdict before you click.

A live hover badge shows the rank, score, and reason for every element as you move your mouse - so you know what to care about before interacting.

The cursor box turns green on Solid elements, blue on Usable, red on Weak. Skip the green ones entirely with one setting toggle.

All devices
<input type="text"> · Weak 10 · no stable attribute found

The ticket is written for you.

Markdown, ZIP, or clipboard - pick the format that fits your ticketing tool.

Markdown excerpt

# User signup flow

>  Screenshots - use the Copy image buttons in the extension

### 3. `admin-delete-btn`

- **Rank**: Weak - no stable attribute found
- **Tag**: `<button>`
- **Text**: "Delete user"
- **CSS selector**: `.admin-row button`
- **XPath**: //*[@id="root"]/div/table/tbody/tr[3]/td[4]/button

**Add to HTML:**
```html
data-testid="admin-delete-btn"
```

> Alternative: an aria-label="Delete user" would also rank as Solid - pick whichever fits your team.

ZIP archive structure

testid-ticket-signup.zip
├── report.md
└── screenshots/
    ├── element-01-email-input.png
    ├── element-02-submit-button.png
    ├── viewport-03-admin-delete-btn.jpg
    └── page-01.png

Copy image for instant paste

Every screenshot has a Copy button. Click it, paste into Jira / GitHub / Linear - the tool uploads the image to its own CDN automatically. Zero friction, zero hosting on your side.

Works with the stack you already have.

Output formats are universal. No new tool to learn. No extra API integration to maintain.

Jira
Linear
GitHub Issues
GitLab
Redmine
Confluence
ServiceNow
Azure DevOps

Detected frameworks

Component names for React, Vue, Angular, Svelte are included in the ticket.

React Vue Angular Svelte

Test frameworks

Suggested data-testid values work out of the box with Playwright, Cypress, TestCafe.

Playwright Cypress TestCafe

What we capture. What stays local. What we never touch.

QA work happens on internal apps with sensitive data. Here is exactly where each byte goes.

Stays in your browser

  • Recordings: stored in chrome.storage.local, never sent anywhere
  • Screenshots: written to disk only when you click Download ZIP
  • DOM snapshots, scoring, suggested data-testid: all computed locally

Leaves only on click

  • Markdown ticket: only when you click Copy or Download
  • Image upload: only when you use Copy image into your ticketing tool
  • Destination is your Jira / GitHub / Linear, not us

Never collected

  • No telemetry, no analytics, no error reporting
  • No account, no login, no cloud sync
  • No external network call without an explicit user action

The extension requests only the permissions strictly required to record interactions on the tab you choose. No background activity, no all-sites permission.

Talk to the team who builds it.

Demo, POC, or just questions - we reply within 24 hours on weekdays.

We'll only use your email to reply. No newsletters, no automation, no dark patterns.