{"record":{"id":"dd213bd0017dc585","repo":"microsoft/playwright","slug":"no-element-matching-selector","errorCode":null,"errorMessage":"No element matching ${selector}","messagePattern":"No element matching (.+?)","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/server/frames.ts","lineNumber":1314,"sourceCode":"    return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options, (progress, handle) => handle._tap(progress, options)));\n  }\n\n  async fill(progress: Progress, selector: string, value: string, options: types.CommonActionOptions) {\n    return dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options, (progress, handle) => handle._fill(progress, value, options)));\n  }\n\n  async focus(progress: Progress, selector: string, options: types.StrictOptions & { noAutoWaiting?: boolean }) {\n    dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options, (progress, handle) => handle._focus(progress)));\n  }\n\n  async blur(progress: Progress, selector: string, options: types.StrictOptions & { noAutoWaiting?: boolean }) {\n    dom.assertDone(await this._retryWithProgressIfNotConnected(progress, selector, options, (progress, handle) => handle._blur(progress)));\n  }\n\n  async resolveSelector(progress: Progress, selector: string, options: { mainWorld?: boolean } = {}): Promise<{ resolvedSelector: string }> {\n    const element = await progress.race(this.selectors.query(selector, options));\n    if (!element)\n      throw new Error(`No element matching ${selector}`);\n\n    const generated = await progress.race(element.evaluateInUtility(async ([injected, node]) => {\n      return injected.generateSelectorSimple(node as unknown as Element);\n    }, {}));\n    if (!generated)\n      throw new Error(`Unable to generate locator for ${selector}`);\n\n    let frame: Frame | null = element._frame;\n    const result = [generated];\n    while (frame?.parentFrame()) {\n      const frameElement = await frame.frameElement(progress);\n      if (frameElement) {\n        const generated = await progress.race(frameElement.evaluateInUtility(async ([injected, node]) => {\n          return injected.generateSelectorSimple(node as unknown as Element);\n        }, {}));\n        frameElement.dispose();\n        if (generated === 'error:notconnected' || !generated)\n          throw new Error(`Unable to generate locator for ${selector}`);","sourceCodeStart":1296,"sourceCodeEnd":1332,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/server/frames.ts#L1296-L1332","documentation":"Thrown by Frame.resolveSelector() when selectors.query() returns null for the given selector string. This method resolves a selector to a full chain (including iframe traversal) and is used internally by MCP tools and locator resolution. It means no element in the frame matches the selector at query time.","triggerScenarios":"Calling resolveSelector with a selector that matches no elements in the current DOM. This can happen when the element has not yet rendered, when the selector is malformed, or when the element is in a different frame than expected.","commonSituations":"Selector references a dynamically-rendered element that hasn't appeared yet. Typo or stale selector after a UI refactor. Element is inside an iframe but the selector was queried on the parent frame. Shadow DOM elements not reachable with the given selector engine.","solutions":["Use page.waitForSelector() or locator.waitFor() before resolving to ensure the element exists.","Verify the selector is correct by testing it in browser DevTools: document.querySelector('your-selector').","If the element is in an iframe, navigate the frame chain first or use frame.locator().","Use Playwright's built-in locator APIs which auto-wait and retry instead of raw resolveSelector."],"exampleFix":"// before\nconst result = await frame.resolveSelector('nonexistent-selector');\n\n// after\nawait frame.waitForSelector('#my-element');\nconst result = await frame.resolveSelector('#my-element');","handlingStrategy":"validation","validationCode":"// Wait for element before resolving selector\nawait page.waitForSelector(selector, { state: 'attached' });\n// Now resolve is safe","typeGuard":null,"tryCatchPattern":"try {\n  await frame.resolveSelector(selector);\n} catch (e) {\n  if (e.message.startsWith('No element matching')) {\n    await frame.waitForSelector(selector, { timeout: 5000 });\n    return frame.resolveSelector(selector);\n  }\n  throw e;\n}","preventionTips":["Always waitForSelector before resolving or querying selectors.","Prefer Playwright locators which auto-wait for elements to appear.","Test selectors in DevTools before using them in tests."],"tags":["selector","resolveselector","element-not-found","frame"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}