{"record":{"id":"7e5bf779121c52fb","repo":"microsoft/playwright","slug":"fullpage-cannot-be-used-with-element-screenshots","errorCode":null,"errorMessage":"fullPage cannot be used with element screenshots.","messagePattern":"fullPage cannot be used with element screenshots\\.","errorType":"validation","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/tools/backend/screenshot.ts","lineNumber":64,"sourceCode":"    case '.jpeg': return 'jpeg';\n    case '.webp': return 'webp';\n  }\n  return undefined;\n}\n\nconst screenshot = defineTabTool({\n  capability: 'core',\n  schema: {\n    name: 'browser_take_screenshot',\n    title: 'Take a screenshot',\n    description: `Take a screenshot of the current page. You can't perform actions based on the screenshot, use browser_snapshot for actions.`,\n    inputSchema: screenshotSchema,\n    type: 'readOnly',\n  },\n\n  handle: async (tab, params, response) => {\n    if (params.fullPage && params.target)\n      throw new Error('fullPage cannot be used with element screenshots.');\n\n    const fileType: ImageFormat = params.type ?? inferTypeFromFilename(params.filename) ?? 'png';\n    const options: playwright.PageScreenshotOptions = {\n      type: fileType,\n      quality: fileType === 'jpeg' ? 90 : undefined,\n      scale: params.scale,\n      ...tab.actionTimeoutOptions,\n      ...(params.fullPage !== undefined && { fullPage: params.fullPage })\n    };\n\n    const screenshotTargetLabel = params.target ? params.element || 'element' : (params.fullPage ? 'full page' : 'viewport');\n    const target = params.target ? await tab.targetLocator({ element: params.element, target: params.target }) : null;\n    const data = target ? await target.locator.screenshot(options) : await tab.page.screenshot(options);\n\n    const resolvedFile = await response.resolveClientFile({ prefix: target ? 'element' : 'page', ext: fileType, suggestedFilename: params.filename }, `Screenshot of ${screenshotTargetLabel}`);\n\n    response.addCode(`// Screenshot ${screenshotTargetLabel} and save it as ${resolvedFile.relativeName}`);\n    if (target)","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/tools/backend/screenshot.ts#L46-L82","documentation":"Thrown by browser_take_screenshot when params.fullPage is truthy AND params.target is set. A full-page screenshot captures the entire scrollable document, which is mutually exclusive with capturing only a single element/target.","triggerScenarios":"Calling the screenshot tool with both fullPage:true and a target (element ref or selector) in the same invocation.","commonSituations":"Agent passing a default options bag that includes fullPage:true and also targeting an element; reusing a params template without clearing conflicting flags.","solutions":["Drop params.target when taking a full-page screenshot.","Or drop params.fullPage (or set it false/undefined) when targeting an element.","Build the params object via two distinct code paths for 'page' vs 'element' screenshots."],"exampleFix":"// before\nawait client.callTool('browser_take_screenshot', {\n  fullPage: true, target: 'e5', element: 'logo'\n}); // throws\n\n// after - pick one\nawait client.callTool('browser_take_screenshot', { fullPage: true });\n// or\nawait client.callTool('browser_take_screenshot', { target: 'e5', element: 'logo' });","handlingStrategy":"validation","validationCode":"function buildScreenshotParams(p: { fullPage?: boolean; target?: string }) {\n  if (p.fullPage && p.target)\n    throw new Error('Choose fullPage OR target, not both');\n  return p;\n}","typeGuard":"function isFullPageScreenshot(p: { fullPage?: boolean; target?: string }): boolean {\n  return !!p.fullPage && !p.target;\n}","tryCatchPattern":"// Prefer validation; try/catch here only if params come from an untrusted source.\ntry {\n  await client.callTool('browser_take_screenshot', params);\n} catch (e) {\n  if (e instanceof Error && e.message === 'fullPage cannot be used with element screenshots.') {\n    const { target, ...rest } = params;\n    await client.callTool('browser_take_screenshot', rest); // fall back to fullPage\n  } else throw e;\n}","preventionTips":["Model full-page vs element screenshots as two distinct code paths.","Never merge a generic options bag into screenshot params without clearing target when fullPage is set."],"tags":["screenshot","input-validation","mcp-tool","mutually-exclusive"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}