{"record":{"id":"fba860a5a619da17","repo":"JuliusBrussee/caveman","slug":"resolve-node-returned-no-object","errorCode":null,"errorMessage":"resolve node returned no object","messagePattern":"resolve node returned no object","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"browse/cdp.go","lineNumber":407,"sourceCode":"\tif err := json.Unmarshal(res.Value, &out); err != nil {\n\t\treturn false, err\n\t}\n\treturn out, nil\n}\n\nfunc (d *CDPDriver) callOnNodeRaw(ctx context.Context, target Target, fn string) (*runtime.RemoteObject, error) {\n\tif target.BackendDOMNodeID <= 0 {\n\t\treturn nil, errors.New(\"missing backend DOM node id\")\n\t}\n\tvar res *runtime.RemoteObject\n\tvar exception *runtime.ExceptionDetails\n\tif err := chromedp.Run(ctx, chromedp.ActionFunc(func(actionCtx context.Context) error {\n\t\tobj, err := dom.ResolveNode().WithBackendNodeID(cdp.BackendNodeID(target.BackendDOMNodeID)).Do(actionCtx)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif obj == nil {\n\t\t\treturn errors.New(\"resolve node returned no object\")\n\t\t}\n\t\tres, exception, err = runtime.CallFunctionOn(fn).WithObjectID(obj.ObjectID).Do(actionCtx)\n\t\treturn err\n\t})); err != nil {\n\t\treturn nil, err\n\t}\n\tif exception != nil {\n\t\treturn nil, errors.New(\"browser function threw\")\n\t}\n\tif res == nil {\n\t\treturn nil, errors.New(\"browser function returned no result object\")\n\t}\n\treturn res, nil\n}\n\nfunc jsString(s string) string {\n\tb, _ := json.Marshal(s)\n\treturn string(b)","sourceCodeStart":389,"sourceCodeEnd":425,"githubUrl":"https://github.com/JuliusBrussee/caveman/blob/3ee70a102609e550bd2e68004bf5990a9341c851/browse/cdp.go#L389-L425","documentation":"Thrown in browse/cdp.go when DOM.resolveNode (via chromedp) completes without error but returns a nil RemoteObject for the target's backend DOM node ID. The library needs a Runtime object handle to call JS functions on the node, so a nil object means the browser could not materialize the node. It is treated as a hard failure rather than silently producing a nil call target.","triggerScenarios":"Calling callOnNode/callBoolOnNode on a target whose BackendDOMNodeID is stale: the DOM node was removed or the frame navigated between target capture and the resolveNode CDP call, so the browser returns no object for that backend node ID.","commonSituations":"Page re-rendered or element detached after a snapshot was taken; SPA navigation replaced the DOM; iframe content removed; running the CDP call against a frame whose execution context is gone.","solutions":["Re-snapshot the page to get a fresh target/handle, then retry the call on the new node.","Check the element still exists before calling (e.g. presence query) and skip detached nodes.","Ensure no navigation or heavy DOM mutation happens between snapshot and node call; await stability first.","If reproducible on iframes, re-resolve within the correct frame's context."],"exampleFix":"// before\ntarget, _ := snap.Targets()[\"#btn\"]\nout, err := sess.CallOnNode(target, fn)\n\n// after\nsnap, err := sess.Refresh() // re-snapshot after DOM changed\ntarget, ok := snap.Targets()[\"#btn\"]\nif !ok { return errors.New(\"node gone; re-snapshot\") }\nout, err := sess.CallOnNode(target, fn)","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"out, err := sess.CallOnNode(target, fn)\nif err != nil && strings.Contains(err.Error(), \"resolve node returned no object\") {\n    snap, rerr := sess.Refresh()\n    if rerr != nil { return rerr }\n    t, ok := snap.Targets()[sel]\n    if !ok { return fmt.Errorf(\"node %s gone\", sel) }\n    out, err = sess.CallOnNode(t, fn)\n}\nreturn err","preventionTips":["Re-snapshot immediately before interacting with elements on dynamic pages.","Wait for network/DOM idle after navigation before capturing targets.","Avoid caching target handles across navigation or re-renders.","Check element presence before calling functions on it."],"tags":["cdp","dom","stale-node","browser"],"backgroundTag":"stale-dom-node-reference","analyzedSha":"3ee70a102609e550bd2e68004bf5990a9341c851","analyzedAt":"2026-09-20T15:53:39.229Z","contentChangedAt":"2026-09-20T15:53:39.229Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}