{"record":{"id":"ea9185be765bee2a","repo":"openclaw/openclaw","slug":"no-pages-available-in-the-connected-browser","errorCode":null,"errorMessage":"No pages available in the connected browser.","messagePattern":"No pages available in the connected browser\\.","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"extensions/browser/src/browser/pw-session-connection.ts","lineNumber":606,"sourceCode":"      targetInfoReads.delete(page);\n    }\n  };\n  void pending.then(evict, evict);\n  return pending;\n}\n\nasync function getPageForTargetIdOnce(opts: {\n  cdpUrl: string;\n  targetId?: string;\n  ssrfPolicy?: SsrFPolicy;\n}): Promise<Page> {\n  if (opts.targetId && isBlockedTarget(opts.cdpUrl, opts.targetId)) {\n    throw new BlockedBrowserTargetError();\n  }\n  const { browser } = await connectBrowser(opts.cdpUrl, opts.ssrfPolicy);\n  const pages = await getAllPages(browser);\n  if (!pages.length) {\n    throw new Error(\"No pages available in the connected browser.\");\n  }\n\n  const { accessible, blockedCount } = await partitionAccessiblePages({\n    cdpUrl: opts.cdpUrl,\n    pages,\n  });\n  if (!accessible.length) {\n    if (blockedCount > 0) {\n      throw new BlockedBrowserTargetError();\n    }\n    throw new Error(\"No pages available in the connected browser.\");\n  }\n  const first = expectDefined(accessible.at(0), \"non-empty accessible browser pages\");\n  if (!opts.targetId) {\n    bindRoleRefsTarget(first.page, opts.cdpUrl, first.targetId);\n    return first.page;\n  }\n  const found = accessible.find((entry) => entry.targetId === opts.targetId);","sourceCodeStart":588,"sourceCodeEnd":624,"githubUrl":"https://github.com/openclaw/openclaw/blob/01804a75319da4b69c9ab98ceaa30477e22b8c0b/extensions/browser/src/browser/pw-session-connection.ts#L588-L624","documentation":"A plain Error thrown when getAllPages(browser) returns an empty array immediately after a successful connectBrowser. The browser connected and reported zero open pages across all contexts. There is no SSRF angle here — the page list is empty before partitionAccessiblePages runs.","triggerScenarios":"Connecting to a Chrome instance that has no open tabs (every tab was closed, or the browser was launched headless with no initial page), or a CDP endpoint that exposes the browser but no page targets. The check `if (!pages.length)` fires before accessible-page partitioning.","commonSituations":"Remote Chrome started with --headless and no about:blank; all tabs were closed by a previous session; a 'browser' CDP endpoint that is actually a service worker / extension context; connecting right after browser launch before the initial page is created.","solutions":["Open a tab first (via the CDP /json/new endpoint or the createPage action), then call getPageForTargetId.","Verify the browser instance has at least one page: curl http://host:PORT/json/list and confirm non-empty.","If launching Chrome yourself, ensure an initial page is created (do not pass --no-first-window or equivalent).","Retry once — initial page creation can lag the connect by a few hundred ms."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":"async function ensurePageExists(cdpUrl: string) {\n  const { browser } = await connectBrowser(cdpUrl);\n  if ((await getAllPages(browser)).length === 0) {\n    // open a tab via /json/new or a createPage action\n  }\n}","typeGuard":null,"tryCatchPattern":"try { return await getPageForTargetId({ cdpUrl }); }\ncatch (e) {\n  if (e instanceof Error && /No pages available/.test(e.message)) {\n    await openNewTab(cdpUrl);\n    return await getPageForTargetId({ cdpUrl });\n  }\n  throw e;\n}","preventionTips":["Ensure Chrome launches with at least one initial page.","Verify /json/list returns at least one entry before selecting a page.","Retry once — initial page creation can lag the connect.","Avoid connecting to a browser that has just closed its last tab."],"tags":["browser","cdp","playwright","pages","empty-state","connection"],"backgroundTag":null,"analyzedSha":"01804a75319da4b69c9ab98ceaa30477e22b8c0b","analyzedAt":"2026-08-12T04:37:58.197Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}