[Regression]: AI aria snapshot drops a button's name when its icon wrapper has whitespace or a CSS-sized SVG
Maintainers usually reply within 1 day
A pull request for this has already been merged.
- #43317 by @pavelfeldman — merged
Assessment
- Difficulty
- 4/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 25/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Stale
- Tech stack
- playwright, typescript
- Domain
- accessibility, testing-qa
Research direction
Start with the supplied TypeScript reproduction in tests/repro.spec.ts and compare AI aria snapshots for the whitespace and CSS-sized SVG cases against the control. The report identifies ariaSnapshotDistiller and removeRedundantNames as possible investigation points. Done means both failing cases retain button "New survey" in the AI snapshot; an open linked pull request is already addressing the issue.
Written by the indexing model from the issue text.
Description
Last Good Version
1.61.0
First Bad Version
1.62.0
Steps to reproduce
Single spec, no app or dependencies beyond @playwright/test:
npm init playwright@latest repro(or any project with@playwright/test1.62.0 or later)- Save this as
tests/repro.spec.ts:
import { test, expect } from '@playwright/test';
const icon = '<svg aria-hidden="true" viewBox="0 0 24 24"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"></path></svg>';
const cases = {
'icon span with whitespace': `<button><span>\n ${icon}</span>New survey</button>`,
'icon styled like MUI SvgIcon': `<button><span><svg aria-hidden="true" viewBox="0 0 24 24" style="width:1em;height:1em;display:inline-block;font-size:1.5rem"><path d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6z"></path></svg></span>New survey</button>`,
'control: no whitespace, unstyled icon': `<button><span>${icon}</span>New survey</button>`,
};
for (const [name, html] of Object.entries(cases)) {
test(name, async ({ page }) => {
await page.setContent(`<main>${html}</main>`);
await expect(page.getByRole('button', { name: 'New survey' })).toHaveCount(1);
const snapshot = await page.locator('main').ariaSnapshot({ mode: 'ai' });
console.log(`${name}:\n${snapshot}`);
expect(snapshot).toContain('button "New survey"');
});
}
npx playwright test tests/repro.spec.ts --reporter=list
| Version | whitespace | MUI-styled icon | control |
|---|---|---|---|
| 1.60.0 | pass | pass | pass |
| 1.61.0 | pass | pass | pass |
| 1.62.0 | fail | fail | pass |
| 1.63.0 | fail | fail | pass |
| 1.64.0 | fail | fail | pass |
| 1.65.0-alpha-2026-10-12 | fail | fail | pass |
Expected behavior
The button keeps its accessible name in the ai snapshot, as it does in 1.61.0 and as getByRole('button', { name: 'New survey' }) resolves it in every version:
- main [ref=e1]:
- button "New survey" [ref=e2]
Actual behavior
Both the name and the text are gone, leaving a bare button:
- main [ref=e1]:
- button [ref=e2]
The same happens in Playwright MCP's browser_snapshot, so an agent sees an unlabeled button [ref=…] and can't find it by its label. The code MCP generates for a click on that ref is still correct (getByRole('button', { name: 'New survey' })), so only the snapshot loses the name.
Additional context
Related to #41985, which reports the same symptom for text nested in spans beside an aria-hidden SVG, but its fix (#41988) doesn't cover these cases: they still fail on 1.64.0 and on today's 1.65 alpha, which include that fix.
Two triggers, found by reducing a real page (an MUI <Button startIcon={<AddIcon />}>):
- A whitespace-only text node inside the icon's wrapper span.
- The icon being sized by CSS, as MUI's
SvgIconis (width: 1em; height: 1em; display: inline-block; font-size: 1.5rem). This is the trigger on the real page: removing the SVG's class restores the name.
From reading the bundled ariaSnapshotDistiller, it looks like removeRedundantNames clears the button's name because its text is a name-from-content contributor that will be rendered, and a later pass then collapses that contributor away, so neither survives. That's a guess at the cause; the repro above is the evidence.
Environment
System:
OS: macOS 26.5.1
CPU: (18) arm64 Apple M5 Pro
Binaries:
Node: 24.14.1
npm: 11.11.0
npmPackages:
@playwright/test: 1.64.0
- Dominant language
- TypeScript
- Stars
- 97.4k
- Forks
- 6.6k
- Avg merge
- 22h 17m
- Merged PRs (30d)
- 278
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from microsoft/playwright
-
[Bug]: Windows: Chrome for Testing crashes in its stack sampling profiler during fullPage screenshotsPossibly taken @yury-s claimed this today. Openneeds-triage-win
Difficulty 2/5 1-3 hours Newbie friendliness 75/100
microsoft/playwright#43327 · 1 comment ·
Maintainers usually reply within 1 day
-
[Feature]: Set `this.name` in `TargetClosedError` constructorMay be free again @LeonxLJX claimed this 40 days ago, and no pull request is open. OpenP3-collecting-feedback
Difficulty 1/5 Under an hour Newbie friendliness 86/100
microsoft/playwright#42522 · 7 comments ·
Maintainers usually reply within 1 day
-
Difficulty 4/5 3-5 days Newbie friendliness 28/100
microsoft/playwright#43347 · 1 comment ·
Maintainers usually reply within 1 day
-
[Bug] Chromium: launch({ proxy: { username, password } }) credentials are sent to a website's 401 Basic challengePossibly taken @yury-s claimed this today. Open
Difficulty 4/5 3-5 days Newbie friendliness 45/100
microsoft/playwright#43326 ·
Maintainers usually reply within 1 day
-
[Bug]: Firefox drops the context's colorScheme and deviceScaleFactor on pages that send Cross-Origin-Opener-PolicyPossibly taken @dgozman claimed this 1 day ago. Openbrowser-firefox v1.65
microsoft/playwright#43287 · 1 comment · 1 assignee ·
Maintainers usually reply within 1 day
All issues in microsoft/playwright
Similar issues
-
e2e-failure ready-to-code
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
redhat-developer/rhdh-plugin-export-overlays#4391 · 1 comment ·
Maintainers usually reply within 1 day
-
Difficulty 1/5 Under an hour Newbie friendliness 82/100
Luligu/matterbridge#655 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
software-mansion/argent#1457 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 62/100
schmayterling/hibi#245 ·
Maintainers usually reply within 1 day
-
ai-driven-qa bug claude Minor
Difficulty 2/5 1-3 hours Newbie friendliness 70/100
linagora/twake-contacts-frontend#241 ·
Maintainers usually reply within 1 day