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]');
+});