diff --git a/src/server/dom.ts b/src/server/dom.ts index 9dbe8be5c2..4e7c65871a 100644 --- a/src/server/dom.ts +++ b/src/server/dom.ts @@ -938,15 +938,19 @@ export function waitForSelectorTask(selector: SelectorInfo, state: 'attached' | let lastElement: Element | undefined; return injected.pollRaf((progress, continuePolling) => { - const element = injected.querySelector(parsed, root || document); + const elements = injected.querySelectorAll(parsed, root || document); + const element = elements[0]; const visible = element ? injected.isVisible(element) : false; if (lastElement !== element) { lastElement = element; - if (!element) + if (!element) { progress.log(` selector did not resolve to any element`); - else + } else { + if (elements.length > 1) + progress.log(` selector resolved to ${elements.length} elements. Proceeding with the first one.`); progress.log(` selector resolved to ${visible ? 'visible' : 'hidden'} ${injected.previewNode(element)}`); + } } switch (state) { diff --git a/tests/page/page-wait-for-selector-1.spec.ts b/tests/page/page-wait-for-selector-1.spec.ts index b9218b3fcf..ef358ebd95 100644 --- a/tests/page/page-wait-for-selector-1.spec.ts +++ b/tests/page/page-wait-for-selector-1.spec.ts @@ -169,6 +169,22 @@ it('should report logs while waiting for hidden', async ({page, server}) => { expect(error.message).toContain(`selector resolved to visible
hello
`); }); +it('should report logs when the selector resolves to multiple elements', async ({page, server}) => { + await page.goto(server.EMPTY_PAGE); + await page.setContent(` + + + `); + const error = await page.click('text=Reset', { + timeout: 1000 + }).catch(e => e); + expect(error.toString()).toContain('selector resolved to 2 elements. Proceeding with the first one.'); +}); + it('should resolve promise when node is added in shadow dom', async ({page, server}) => { await page.goto(server.EMPTY_PAGE); const watchdog = page.waitForSelector('span');