From 0ed3c79d51625e5adce7fd2448dc0beca814989a Mon Sep 17 00:00:00 2001 From: Joel Einbinder Date: Mon, 23 Aug 2021 16:54:02 -0400 Subject: [PATCH] fix(selectors): nicer errors if the selector engine returns a bad value (#8259) Co-authored-by: Pavel Feldman --- src/server/injected/injectedScript.ts | 5 ++++- tests/selectors-register.spec.ts | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/src/server/injected/injectedScript.ts b/src/server/injected/injectedScript.ts index ec2c0e6924..74549e975b 100644 --- a/src/server/injected/injectedScript.ts +++ b/src/server/injected/injectedScript.ts @@ -157,8 +157,11 @@ export class InjectedScript { queryResults[index] = all; } - for (const element of all) + for (const element of all) { + if (!('nodeName' in element)) + throw new Error(`Expected a Node but got ${Object.prototype.toString.call(element)}`); result.push({ element, capture }); + } } return this._querySelectorRecursively(result, selector, index + 1, queryCache); } diff --git a/tests/selectors-register.spec.ts b/tests/selectors-register.spec.ts index ae388e28c8..22f0d8c063 100644 --- a/tests/selectors-register.spec.ts +++ b/tests/selectors-register.spec.ts @@ -133,3 +133,19 @@ it('should not rely on engines working from the root', async ({ playwright, brow await page.setContent(``); expect(await page.$eval('input >> __value=value2', e => e.id)).toBe('input2'); }); + +it('should throw a nice error if the selector returns a bad value', async ({ playwright, browser }) => { + const page = await browser.newPage(); + const createFakeEngine = () => ({ + query(root, selector) { + return [document.body]; + }, + queryAll(root, selector) { + return [[document.body]]; + }, + }); + + await playwright.selectors.register('__fake', createFakeEngine); + const error = await page.$('__fake=value2').catch(e => e); + expect(error.message).toContain('Expected a Node but got [object Array]'); +});