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 option/optgroup correctly', async ({ page }) => {
+ await page.setContent(`
+
+ `);
+ 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);