From 8f71f5971b2246ea5d2fce426b6e598c93cf0108 Mon Sep 17 00:00:00 2001 From: Dmitry Gozman Date: Thu, 1 Apr 2021 12:30:05 -0700 Subject: [PATCH] fix(input): do not retarget from input/textarea/select to an ancestor button (#6036) Although such markup is not expected, it happens in the wild. Retargeting in this case in unexpected, so we check/click/etc the control itself. --- src/server/injected/injectedScript.ts | 3 ++- test/page/page-check.spec.ts | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/src/server/injected/injectedScript.ts b/src/server/injected/injectedScript.ts index fc6d26d43f..9b05f56f39 100644 --- a/src/server/injected/injectedScript.ts +++ b/src/server/injected/injectedScript.ts @@ -330,7 +330,8 @@ export class InjectedScript { let element = node.nodeType === Node.ELEMENT_NODE ? node as Element : node.parentElement; if (!element) return null; - element = element.closest('button, [role=button], [role=checkbox], [role=radio]') || element; + if (!element.matches('input, textarea, select')) + element = element.closest('button, [role=button], [role=checkbox], [role=radio]') || element; if (behavior === 'follow-label') { if (!element.matches('input, textarea, button, select, [role=button], [role=checkbox], [role=radio]') && !(element as any).isContentEditable) { diff --git a/test/page/page-check.spec.ts b/test/page/page-check.spec.ts index 29b085b000..3fa48fcc3b 100644 --- a/test/page/page-check.spec.ts +++ b/test/page/page-check.spec.ts @@ -98,3 +98,11 @@ it('should throw when not a checkbox', async ({page}) => { const error = await page.check('div').catch(e => e); expect(error.message).toContain('Not a checkbox or radio button'); }); + +it('should check the box inside a button', async ({page}) => { + await page.setContent(`
`); + await page.check('input'); + expect(await page.$eval('input', input => input.checked)).toBe(true); + expect(await page.isChecked('input')).toBe(true); + expect(await (await page.$('input')).isChecked()).toBe(true); +});