diff --git a/packages/playwright-core/src/server/injected/injectedScript.ts b/packages/playwright-core/src/server/injected/injectedScript.ts index 312ad28f1a..b9d92e3680 100644 --- a/packages/playwright-core/src/server/injected/injectedScript.ts +++ b/packages/playwright-core/src/server/injected/injectedScript.ts @@ -1237,7 +1237,7 @@ function deepEquals(a: any, b: any): boolean { } function isElementDisabled(element: Element): boolean { - const isRealFormControl = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA'].includes(element.nodeName); + const isRealFormControl = ['BUTTON', 'INPUT', 'SELECT', 'TEXTAREA', 'OPTION', 'OPTGROUP'].includes(element.nodeName); if (isRealFormControl && element.hasAttribute('disabled')) return true; if (isRealFormControl && hasDisabledFieldSet(element)) diff --git a/tests/page/elementhandle-convenience.spec.ts b/tests/page/elementhandle-convenience.spec.ts index bb5a4fb657..ff17d8c9c5 100644 --- a/tests/page/elementhandle-convenience.spec.ts +++ b/tests/page/elementhandle-convenience.spec.ts @@ -260,6 +260,29 @@ it('isEnabled and isDisabled should work', async ({ page }) => { expect(await page.isDisabled(':text("button2")')).toBe(false); }); +it('isEnabled and isDisabled should work with + + + + + + + + + + `); + expect((await (await page.$('#enabled1')).isEnabled())).toBe(true); + expect((await (await page.$('#enabled1')).isDisabled())).toBe(false); + expect((await (await page.$('#disabled1')).isEnabled())).toBe(false); + expect((await (await page.$('#disabled1')).isDisabled())).toBe(true); + expect((await (await page.$('optgroup >> nth=0')).isEnabled())).toBe(true); + expect((await (await page.$('optgroup >> nth=0')).isDisabled())).toBe(false); + expect((await (await page.$('optgroup >> nth=1')).isEnabled())).toBe(false); + expect((await (await page.$('optgroup >> nth=1')).isDisabled())).toBe(true); +}); + it('isEditable should work', async ({ page }) => { await page.setContent(``); await page.$eval('textarea', t => t.readOnly = true);