{"record":{"id":"7278d65dd42bc472","repo":"microsoft/playwright","slug":"param-target-does-not-match-any-elements","errorCode":null,"errorMessage":"\"${param.target}\" does not match any elements.","messagePattern":"\"(.+?)\" does not match any elements\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/tools/backend/tab.ts","lineNumber":504,"sourceCode":"\n  async waitForCompletion(callback: () => Promise<void>) {\n    await this._initializedPromise;\n    await this._raceAgainstModalStates(() => waitForCompletion(this, callback));\n  }\n\n  async targetLocator(params: { element?: string, target: string }): Promise<{ locator: playwright.Locator, resolved: string, selector: string }> {\n    await this._initializedPromise;\n    return (await this.targetLocators([params]))[0];\n  }\n\n  async targetLocators(params: { element?: string, target: string }[]): Promise<{ locator: playwright.Locator, resolved: string, selector: string }[]> {\n    await this._initializedPromise;\n    return Promise.all(params.map(async param => {\n      if (!param.target.match(/^(f\\d+)?e\\d+$/)) {\n        const selector = locatorOrSelectorAsSelector('javascript', param.target, this.context.config.testIdAttribute || 'data-testid');\n        const handle = await this.page.$(selector);\n        if (!handle)\n          throw new Error(`\"${param.target}\" does not match any elements.`);\n        handle.dispose().catch(() => {});\n        return { locator: this.page.locator(selector), resolved: asLocator('javascript', selector), selector };\n      } else {\n        try {\n          let locator = this.page.locator(`aria-ref=${param.target}`);\n          if (param.element)\n            locator = locator.describe(param.element);\n          const resolved = await locator.normalize();\n          return { locator, resolved: resolved.toString(), selector: locatorSelector(resolved) };\n        } catch (e) {\n          throw new Error(`Ref ${param.target} not found in the current page snapshot. Try capturing new snapshot.`);\n        }\n      }\n    }));\n  }\n\n  async waitForTimeout(time: number) {\n    if (this._javaScriptBlocked()) {","sourceCodeStart":486,"sourceCodeEnd":522,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/tools/backend/tab.ts#L486-L522","documentation":"Thrown by Tab.targetLocator when params.target does NOT look like an aria ref (does not match /^(f\\d+)?e\\d+$/), so it is treated as a CSS/locator string, converted to a selector, and page.$(selector) returns null — meaning no element matches in the DOM.","triggerScenarios":"Passing a raw CSS selector or Playwright locator string (e.g. \"button#go\", \"text=Submit\") that does not match any element at the time targetLocator runs.","commonSituations":"Stale or mistyped selector; the element is in a shadow DOM not reachable by the selector; the page has not finished loading the target; ref string was hand-edited and no longer matches the ref pattern.","solutions":["Capture a fresh snapshot with browser_snapshot and use the returned element ref (e.g. e12) instead of a hand-written selector.","If using a raw selector, verify it with page.locator(selector).count() > 0 before calling the tool.","Correct typos or update the selector to match the current DOM (including shadow-piercing >> combinators if needed)."],"exampleFix":"// before\nawait client.callTool('browser_click', { element: 'go', target: 'buttton#go' }); // typo -> no match -> throws\n\n// after\nawait client.callTool('browser_click', { element: 'go', target: 'e12' }); // ref from latest snapshot","handlingStrategy":"validation","validationCode":"import { locatorOrSelectorAsSelector } from '...';\nasync function ensureSelectorMatches(page, target, testIdAttribute) {\n  const selector = locatorOrSelectorAsSelector('javascript', target, testIdAttribute || 'data-testid');\n  const handle = await page.$(selector);\n  return !!handle;\n}\nif (await ensureSelectorMatches(page, target, 'data-testid')) {\n  await client.callTool('browser_click', { element, target });\n}","typeGuard":"function looksLikeRef(target: string): boolean {\n  return /^(f\\d+)?e\\d+$/.test(target);\n}","tryCatchPattern":"try {\n  await client.callTool('browser_click', { element, target });\n} catch (e) {\n  if (e instanceof Error && e.message.endsWith('does not match any elements.')) {\n    // re-snapshot and retry with a fresh ref\n    await client.callTool('browser_snapshot', {});\n  } else throw e;\n}","preventionTips":["Prefer snapshot refs (eNN) over hand-written selectors for MCP flows.","Validate raw selectors with page.locator(selector).count() before passing them in.","Treat any non-ref target as fragile; re-snapshot on DOM changes."],"tags":["locator","element-resolution","mcp-tool","snapshot"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}