diff --git a/packages/playwright-core/src/server/injected/injectedScript.ts b/packages/playwright-core/src/server/injected/injectedScript.ts index f88ca5b8d2cd8..b83232e00b429 100644 --- a/packages/playwright-core/src/server/injected/injectedScript.ts +++ b/packages/playwright-core/src/server/injected/injectedScript.ts @@ -804,8 +804,11 @@ export class InjectedScript { while (container) { // elementFromPoint works incorrectly in Chromium (http://crbug.com/1188919), // so we use elementsFromPoint instead. - const elements = (container as Document).elementsFromPoint(x, y); - const innerElement = elements[0] as Element | undefined; + const elements: Element[] = container.elementsFromPoint(x, y); + let innerElement = elements[0] as Element | undefined; + // Workaround https://bugs.chromium.org/p/chromium/issues/detail?id=1307458. + if (elements[0] && elements[1] && elements[0].contains(elements[1]) && container.elementFromPoint(x, y) === elements[1]) + innerElement = elements[1]; if (!innerElement || element === innerElement) break; element = innerElement; diff --git a/tests/hit-target.spec.ts b/tests/hit-target.spec.ts index dc499bd593f08..57c3aaf802a55 100644 --- a/tests/hit-target.spec.ts +++ b/tests/hit-target.spec.ts @@ -180,3 +180,62 @@ it('should work with drag and drop that moves the element under cursor', async ( await page.dragAndDrop('#from', '#to'); await expect(page.locator('#to')).toHaveText('Dropped'); }); + +it('should work with block inside inline', async ({ page, server }) => { + await page.goto(server.EMPTY_PAGE); + await page.setContent(` +