{"record":{"id":"53e32f274d9fb9a2","repo":"grafana/k6","slug":"getting-page-frame-tree-w","errorCode":null,"errorMessage":"getting page frame tree: %w","messagePattern":"getting page frame tree: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/js/modules/k6/browser/common/frame_session.go","lineNumber":434,"sourceCode":"}\n\nfunc (fs *FrameSession) initFrameTree() error {\n\tfs.logger.Debugf(\"NewFrameSession:initFrameTree\",\n\t\t\"sid:%v tid:%v\", fs.session.ID(), fs.targetID)\n\n\taction := cdppage.Enable()\n\tif err := action.Do(cdp.WithExecutor(fs.ctx, fs.session)); err != nil {\n\t\treturn fmt.Errorf(\"enabling page domain: %w\", err)\n\t}\n\n\tvar frameTree *cdppage.FrameTree\n\tvar err error\n\n\t// Recursively enumerate all existing frames in page to create initial in-memory structures\n\t// used for access and manipulation from JS.\n\taction2 := cdppage.GetFrameTree()\n\tif frameTree, err = action2.Do(cdp.WithExecutor(fs.ctx, fs.session)); err != nil {\n\t\treturn fmt.Errorf(\"getting page frame tree: %w\", err)\n\t} else if frameTree == nil {\n\t\t// This can happen with very short scripts when we might not have enough\n\t\t// time to initialize properly.\n\t\treturn fmt.Errorf(\"got a nil page frame tree\")\n\t}\n\n\t// Any new frame may have a child frame, not just mainframes.\n\tfs.handleFrameTree(frameTree, fs.isMainFrame())\n\n\tif fs.isMainFrame() {\n\t\tfs.initRendererEvents()\n\t}\n\treturn nil\n}\n\nfunc (fs *FrameSession) initIsolatedWorld(name string) error {\n\tfs.logger.Debugf(\"NewFrameSession:initIsolatedWorld\",\n\t\t\"sid:%v tid:%v\", fs.session.ID(), fs.targetID)","sourceCodeStart":416,"sourceCodeEnd":452,"githubUrl":"https://github.com/grafana/k6/blob/93accf6570dcd306ca5e99cc44c393ee3797761b/internal/js/modules/k6/browser/common/frame_session.go#L416-L452","documentation":"Right after Page.enable, initFrameTree (frame_session.go:434) calls Page.getFrameTree to build k6's in-memory frame structures. If the CDP call itself errors, it is wrapped with this message. This is a transport/target-level failure (dead session, crashed renderer) — distinct from the nil-tree case which is handled separately.","triggerScenarios":"Renderer process crash while the frame tree is fetched, target detached mid-init during page close, or CDP session terminated by a remote browser/proxy. Most common on pages that navigate or die immediately after creation.","commonSituations":"Very short-lived pages (instant redirect then close), renderer crashes from heavy pages under memory pressure, and unstable remote browser connections.","solutions":["Retry the operation (new page or goto) — these races are often transient at attach time","Avoid creating pages that immediately self-close; add small delays or wait for a stable state after goto","If persistent, capture chromium crash logs (chrome_debug.log / --enable-logging) to find the renderer crash cause"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"try {\n  const page = browser.newPage();\n  page.goto(url);\n} catch (e) {\n  if (/getting page frame tree/i.test(String(e))) {\n    // transient init race — one retry on a fresh page usually succeeds\n  }\n}","preventionTips":["Avoid pages that navigate or close immediately after creation","Add a selector/lifecycle wait after goto so init completes against a stable target"],"tags":["browser","cdp","frame-tree","renderer","transient"],"backgroundTag":null,"analyzedSha":"93accf6570dcd306ca5e99cc44c393ee3797761b","analyzedAt":"2026-08-15T21:23:27.118Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}