[Bug]: getByLabel (and accessible name) ignore <label> for form-associated custom elements
I maintainer di solito rispondono entro 1 giorno
Una pull request collegata è già stata integrata.
- #43900 di @microsoft-playwright-automation — integrata
Valutazione
- Difficoltà
- 3/5
- Tempo stimato
- 1-2 giorni
- Idoneità per principianti
- 25/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Ferma
- Stack tecnologico
- html, playwright, typescript
- Ambito
- accessibility, testing-qa
Direzione di ricerca
Start in packages/injected/src/selectorUtils.ts and read getElementLabels, then trace how those labels feed getByLabel and accessible name computation. A linked pull request (#43900) is already open; completion would require both locators in the reproduction to resolve to the custom element and the related tests to pass.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Version
1.64.1
Steps to reproduce
import { test, expect } from '@playwright/test';
test('label of a form-associated custom element', async ({ page }) => {
await page.setContent(`
<label for="city">City</label><my-field id="city">Pick one</my-field>
<label>Street <my-field>Pick one</my-field></label>`);
await page.addScriptTag({ content: `
customElements.define('my-field', class extends HTMLElement {
static formAssociated = true;
constructor() { super(); this.attachInternals(); }
connectedCallback() { this.tabIndex = 0; }
});` });
// The browser associates both labels with the custom elements:
expect(await page.evaluate(() => [...document.querySelectorAll('label')].map((l) => l.control?.localName)))
.toEqual(['my-field', 'my-field']);
await expect(page.getByLabel('City')).toHaveCount(1); // ❌ 0
await expect(page.getByLabel('Street')).toHaveCount(1); // ❌ 0
});
Expected behavior
getByLabel('City') and getByLabel('Street') each resolve to the <my-field> element.
Form-associated custom elements are labelable elements. The browser associates the <label> with them, both for for= and for nesting: label.control returns the element, and Chrome's accessibility tree names it from the label (with role = 'combobox' set through ElementInternals, Chrome exposes combobox "City").
Actual behavior
Both locators resolve to 0 elements.
getElementLabels (packages/injected/src/selectorUtils.ts) reads element.labels only for a fixed list of native elements:
const isNonHiddenInput = element.nodeName === 'INPUT' && element.type !== 'hidden';
if (['BUTTON', 'METER', 'OUTPUT', 'PROGRESS', 'SELECT', 'TEXTAREA'].includes(element.nodeName) || isNonHiddenInput) {
const labels = element.labels;
...
A form-associated custom element has no public .labels (only ElementInternals.labels, which is private to the element), so the element side can't be read. The label side can: HTMLLabelElement.control returns the custom element for both for= and nesting, so no new browser API is needed.
Additional context
- Related, but different: #34264 (roles and states set through
ElementInternals). That one needs access to the element's internals. This one doesn't: the association is readable today throughlabel.control. - Possible fix: when the element is a form-associated custom element (
customElements.get(el.localName)?.formAssociated), collect the<label>elements in its tree whosecontrol === el, and use their text, excluding the text of the control nested inside a label (as is already done for native controls). The same labels should feed the accessible name computation (step 2D) used bygetByRole({ name }). - It matters more and more: design systems build form controls as form-associated custom elements precisely so that
<label for>works as with native controls.
Environment
Playwright 1.64.1, Chrome. The lookup happens in Playwright's injected script, so it shouldn't depend on the browser.
- Lingua principale
- TypeScript
- Stelle
- 99.1k
- Fork
- 6.8k
- Merge medio
- 16h 20m
- PR unite (30g)
- 324
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di microsoft/playwright
-
needs-triage
Difficoltà 5/5 Più di una settimana Idoneità per principianti 30/100
microsoft/playwright#43969 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
needs-triage
Difficoltà 3/5 1-2 giorni Idoneità per principianti 45/100
microsoft/playwright#43967 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
needs-triage
Difficoltà 4/5 3-5 giorni Idoneità per principianti 57/100
microsoft/playwright#43966 · 5 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
[Bug]: page.screenshot({ fullPage: true }) times out on SVG documents (no document.body)Forse già presa @microsoft-playwright-automation l’ha presa oggi. Apertaneeds-triage
Difficoltà 3/5 1-2 giorni Idoneità per principianti 25/100
microsoft/playwright#43962 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
needs-triage
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
microsoft/playwright#43926 · 4 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di microsoft/playwright
Issue simili
-
bug
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
Yeraze/meshmonitor#6239 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
better-auth/better-auth#12292 · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
The sample email preview's ResizeObserver is never disconnected and keeps raising errors after leaving SettingsForse già presa Una pull request collegata a questa issue è aperta o già unita. Apertabug
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
I maintainer di solito rispondono entro 1 giorno
-
area:ui bug effort:S priority:P2
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
Typo in WSL project description on Projects pageForse già presa @akhil9tiet l’ha presa oggi. Aperta
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 75/100
microsoft/opensource.microsoft.com#1066 · 1 commento ·