{"record":{"id":"0f80ae418fd1ae9c","repo":"microsoft/playwright","slug":"unable-to-adopt-element-handle-from-a-different-do","errorCode":null,"errorMessage":"Unable to adopt element handle from a different document","messagePattern":"Unable to adopt element handle from a different document","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/playwright-core/src/server/bidi/bidiPage.ts","lineNumber":698,"sourceCode":"  }\n\n  async setInputFilePaths(progress: Progress, handle: dom.ElementHandle<HTMLInputElement>, paths: string[]): Promise<void> {\n    const fromContext = toBidiExecutionContext(handle._context);\n    await progress.race(this._session.send('input.setFiles', {\n      context: this._session.sessionId,\n      element: await progress.race(fromContext.nodeIdForElementHandle(handle)),\n      files: paths,\n    }));\n  }\n\n  async adoptElementHandle<T extends Node>(handle: dom.ElementHandle<T>, to: dom.FrameExecutionContext): Promise<dom.ElementHandle<T>> {\n    const fromContext = toBidiExecutionContext(handle._context);\n    const nodeId = await fromContext.nodeIdForElementHandle(handle);\n    const executionContext = toBidiExecutionContext(to);\n    try {\n      return await executionContext.remoteObjectForNodeId(to, nodeId) as dom.ElementHandle<T>;\n    } catch {\n      throw new Error(dom.kUnableToAdoptErrorMessage);\n    }\n  }\n\n  async inputActionEpilogue(): Promise<void> {\n  }\n\n  async resetForReuse(progress: Progress): Promise<void> {\n    // See https://github.com/microsoft/playwright/issues/22432.\n    await this.rawMouse.move(progress, 0, 0, 'none', new Set(), new Set(), false);\n  }\n\n  async pdf(options: channels.PagePdfParams): Promise<Buffer> {\n    return this._pdf.generate(options);\n  }\n\n  async getFrameElement(frame: frames.Frame): Promise<dom.ElementHandle> {\n    const parent = frame.parentFrame();\n    if (!parent)","sourceCodeStart":680,"sourceCodeEnd":716,"githubUrl":"https://github.com/microsoft/playwright/blob/c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6/packages/playwright-core/src/server/bidi/bidiPage.ts#L680-L716","documentation":"`adoptElementHandle` re-throws a generic message when BiDi's `remoteObjectForNodeId` fails to re-parent a node into a different frame's execution context. Cross-document node adoption is limited under BiDi; the catch hides the underlying BiDi error behind `kUnableToAdoptErrorMessage`.","triggerScenarios":"Adopting an element handle from one frame (especially cross-origin) into another via internal `adoptElementHandle` — reached through `frame.evaluate`/locator logic that passes elements across frame boundaries.","commonSituations":"Cross-origin iframes in Firefox BiDi; passing ElementHandles between frames in evaluate calls; mixins that reuse handles outside their origin frame.","solutions":["Re-query the element in the target frame instead of adopting across frames","Use Locators scoped to the correct frame","Avoid passing ElementHandles across cross-origin frame boundaries"],"exampleFix":"// before\nconst handle = await frame1.locator('button').elementHandle();\nawait frame2.evaluate(h => h.click(), handle); // cross-frame adoption\n\n// after\nawait frame2.locator('button').click(); // re-query in target frame","handlingStrategy":"try-catch","validationCode":"// Prefer re-querying elements in the target frame rather than adopting handles.\n// If you must pass a handle, verify same-origin first:\nfunction sameOrigin(a: URL, b: URL): boolean {\n  return a.origin === b.origin;\n}","typeGuard":null,"tryCatchPattern":"try {\n  await targetFrame.evaluate(fn, handleFromOtherFrame);\n} catch (e) {\n  if (e instanceof Error && /adopt element handle/.test(e.message)) {\n    // re-query the element inside the target frame instead\n    await targetFrame.locator(selector).click();\n    return;\n  }\n  throw e;\n}","preventionTips":["Use Locators scoped to the correct frame instead of cross-frame ElementHandles","Avoid passing handles across cross-origin iframe boundaries","Re-query elements in the destination frame when adoption fails"],"tags":["bidi","firefox","frames","element-handle"],"backgroundTag":null,"analyzedSha":"c8fc3bf8d31542d59b4d4d9eaab1df93ff541dc6","analyzedAt":"2026-08-12T07:26:36.950Z","schemaVersion":2},"datasetVersion":"2026-08-12T13:17:24.610Z"}