diff --git a/packages/playwright-core/src/client/selectors.ts b/packages/playwright-core/src/client/selectors.ts index 9720b838e61fd..3a34cef5a96ff 100644 --- a/packages/playwright-core/src/client/selectors.ts +++ b/packages/playwright-core/src/client/selectors.ts @@ -34,6 +34,9 @@ export class Selectors implements api.Selectors { } async register(name: string, script: string | (() => SelectorEngine) | { path?: string, content?: string }, options: { contentScript?: boolean } = {}): Promise { + if (this._selectorEngines.some(engine => engine.name === name)) + throw new Error(`selectors.register: "${name}" selector engine has been already registered`); + const source = await evaluationScript(this._platform, script, undefined, false); const selectorEngine: channels.SelectorEngine = { ...options, name, source }; for (const context of this._contextsForSelectors) diff --git a/tests/library/selectors-register.spec.ts b/tests/library/selectors-register.spec.ts index 4bc0305749c2f..83fb73971eedf 100644 --- a/tests/library/selectors-register.spec.ts +++ b/tests/library/selectors-register.spec.ts @@ -145,6 +145,11 @@ it('should handle errors', async ({ playwright, browser }) => { await page.close(); }); +it('should throw "already registered" error when registering', { annotation: { type: 'issue', description: 'https://github.com/microsoft/playwright/issues/36467' } }, async ({ playwright }) => { + await playwright.selectors.register('alreadyRegistered', createTagSelector); + await expect(playwright.selectors.register('alreadyRegistered', createTagSelector)).rejects.toThrowError('selectors.register: "alreadyRegistered" selector engine has been already registered'); +}); + it('should not rely on engines working from the root', async ({ playwright, browser }) => { const page = await browser.newPage(); const createValueEngine = () => ({