diff --git a/packages/playwright-core/src/server/injected/selectorGenerator.ts b/packages/playwright-core/src/server/injected/selectorGenerator.ts index ad6df946b9..93d5e0ba70 100644 --- a/packages/playwright-core/src/server/injected/selectorGenerator.ts +++ b/packages/playwright-core/src/server/injected/selectorGenerator.ts @@ -161,7 +161,7 @@ function buildCandidates(injectedScript: InjectedScript, element: Element): Sele if (element.getAttribute('role')) candidates.push({ engine: 'css', selector: `${cssEscape(element.nodeName.toLowerCase())}[role=${quoteAttributeValue(element.getAttribute('role')!)}]` , score: 50 }); - if (element.getAttribute('name') && ['BUTTON', 'FORM', 'FIELDSET', 'IFRAME', 'INPUT', 'KEYGEN', 'OBJECT', 'OUTPUT', 'SELECT', 'TEXTAREA', 'MAP', 'META', 'PARAM'].includes(element.nodeName)) + if (element.getAttribute('name') && ['BUTTON', 'FORM', 'FIELDSET', 'FRAME', 'IFRAME', 'INPUT', 'KEYGEN', 'OBJECT', 'OUTPUT', 'SELECT', 'TEXTAREA', 'MAP', 'META', 'PARAM'].includes(element.nodeName)) candidates.push({ engine: 'css', selector: `${cssEscape(element.nodeName.toLowerCase())}[name=${quoteAttributeValue(element.getAttribute('name')!)}]`, score: 50 }); if (['INPUT', 'TEXTAREA'].includes(element.nodeName) && element.getAttribute('type') !== 'hidden') { if (element.getAttribute('type')) diff --git a/tests/library/selector-generator.spec.ts b/tests/library/selector-generator.spec.ts index cef94b4d24..a8da7250f6 100644 --- a/tests/library/selector-generator.spec.ts +++ b/tests/library/selector-generator.spec.ts @@ -301,6 +301,12 @@ it.describe('selector generator', () => { await page.setContent(`
`); expect(await generate(page, '[name=bar]')).toBe(`${tagName}[name="bar"]`); } + + await page.setContent(``); + expect(await generate(page, '[name=bar]')).toBe(`iframe[name="bar"]`); + + await page.setContent(``); + expect(await generate(page, '[name=bar]')).toBe(`frame[name="bar"]`); }); it('should work with tricky attributes', async ({ page }) => {