{"record":{"id":"d4ea5693ba14dea9","repo":"Mintplex-Labs/anything-llm","slug":"no-browser-pages-open","errorCode":null,"errorMessage":"No browser pages open.","messagePattern":"No browser pages open\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"open-computer/services/interface-service/utils/cdp-eval.js","lineNumber":85,"sourceCode":"async function main() {\n  const versionRaw = await httpGet(\"http://127.0.0.1:9222/json/version\");\n  const version = JSON.parse(versionRaw);\n  const browserWsUrl = version.webSocketDebuggerUrl;\n  if (!browserWsUrl) throw new Error(\"No webSocketDebuggerUrl — is Chromium running?\");\n\n  const ws = await new Promise((resolve, reject) => {\n    const socket = new WebSocket(browserWsUrl);\n    const t = setTimeout(() => reject(new Error(\"WS connect timeout\")), 5000);\n    socket.on(\"open\", () => { clearTimeout(t); resolve(socket); });\n    socket.on(\"error\", (err) => { clearTimeout(t); reject(err); });\n  });\n\n  try {\n    const { targetInfos } = await cdpSend(ws, \"Target.getTargets\");\n    const pages = targetInfos.filter(\n      (t) => t.type === \"page\" && !t.url.startsWith(\"chrome://\") && !t.url.startsWith(\"devtools://\")\n    );\n    if (pages.length === 0) throw new Error(\"No browser pages open.\");\n\n    let target = pages[pages.length - 1];\n    if (targetUrl) {\n      const match = pages.find(\n        (p) => p.url.includes(targetUrl) || p.title.toLowerCase().includes(targetUrl.toLowerCase())\n      );\n      if (!match) {\n        const openTabs = pages.map((p) => `- ${p.title} ${p.url}`).join(\"\\n\");\n        throw new Error(`No browser tab matching \"${targetUrl}\". Open tabs:\\n${openTabs}`);\n      }\n      if (match) target = match;\n    }\n\n    const { sessionId } = await cdpSend(ws, \"Target.attachToTarget\", {\n      targetId: target.targetId,\n      flatten: true,\n    });\n","sourceCodeStart":67,"sourceCodeEnd":103,"githubUrl":"https://github.com/Mintplex-Labs/anything-llm/blob/3aec848f2885144aa8f1e53b9731a04310d5d558/open-computer/services/interface-service/utils/cdp-eval.js#L67-L103","documentation":"Thrown by cdp-eval after successfully connecting to Chromium's browser WS endpoint: Target.getTargets returned targets, but after filtering to type 'page' and excluding chrome:// and devtools:// URLs the list is empty. So the debugger is reachable but there is no attachable web page — only internal chrome pages (new tab, settings, devtools windows) or non-page targets (service workers, background pages) exist.","triggerScenarios":"Chromium freshly started with remote debugging but sitting on the NTP (chrome://newtab) with no site opened; all tabs navigated to chrome:// URLs; only DevTools windows are open; the agent opened the browser but a page navigation has not happened yet.","commonSituations":"Race at session start: the helper runs before the agent's start page (e.g. about:blank vs a real URL) finishes creating; user manually closed all regular tabs while the agent was working; kiosk setups that only ever show chrome://apps.","solutions":["Open a real web page in the Chromium instance (any http/https URL) and retry the eval call","If racing at startup, retry after a short delay once the start page has loaded","Change the browser's startup/home page to a real URL (not chrome://newtab) so a page target always exists","Confirm with curl http://127.0.0.1:9222/json/list that at least one entry has type page and a non-chrome:// url"],"exampleFix":"# before: only chrome://newtab open -> 'No browser pages open.'\n# after: pre-open a page before running the helper\nchromium --remote-debugging-port=9222 --user-data-dir=/tmp/oc-chrome 'https://example.com' &\ncurl -s http://127.0.0.1:9222/json/list | jq '.[] | select(.type==\"page\") | .url'","handlingStrategy":"validation","validationCode":"async function hasRealPage() {\n  const targets = await (await fetch('http://127.0.0.1:9222/json/list')).json();\n  return targets.some((t) => t.type === 'page' && !t.url.startsWith('chrome://') && !t.url.startsWith('devtools://'));\n}\nif (!(await hasRealPage())) { /* open http://example.com in the debugged Chromium first */ }","typeGuard":null,"tryCatchPattern":"try { await evalInPage(expr); } catch (e) { if (/No browser pages open/.test(e.message)) { await openPage('https://example.com'); await evalInPage(expr); } else throw e; }","preventionTips":["Launch Chromium with a real start URL so a page target always exists before helpers run","After browser start, wait until /json/list shows a non-chrome:// page before dispatching eval/input","Keep at least one regular tab open in automated sessions — don't let scripts close the last one"],"tags":["chrome","cdp","devtools","targets","open-computer"],"backgroundTag":"cdp-no-page-targets","analyzedSha":"3aec848f2885144aa8f1e53b9731a04310d5d558","analyzedAt":"2026-08-18T10:02:21.017Z","contentChangedAt":"2026-08-18T10:02:21.017Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}