{"record":{"id":"582bf0dc251f6386","repo":"jackwener/OpenCLI","slug":"boss-search-requires-cdp-network-capture","errorCode":null,"errorMessage":"BOSS search requires CDP network capture","messagePattern":"BOSS search requires CDP network capture","errorType":"exception","errorClass":"CommandExecutionError","httpStatus":null,"severity":"error","filePath":"clis/boss/search.js","lineNumber":98,"sourceCode":"        return '';\n    if (JOB_TYPE_MAP[input] !== undefined)\n        return JOB_TYPE_MAP[input];\n    if (JOB_TYPE_CODES.has(input))\n        return input;\n    throw new ArgumentError(`Invalid jobType: ${input}`, 'Use one of: 全职, 兼职, 实习, 不限');\n}\nfunction formatBossOnline(value) {\n    if (value === true)\n        return 'Y';\n    if (value === false)\n        return 'N';\n    return '';\n}\nasync function captureJobList(page, url) {\n    if (typeof page.startNetworkCapture !== 'function' ||\n        typeof page.readNetworkCapture !== 'function' ||\n        !await page.startNetworkCapture('joblist.json')) {\n        throw new CommandExecutionError('BOSS search requires CDP network capture');\n    }\n    await page.readNetworkCapture();\n    for (let attempt = 0; attempt < 2; attempt++) {\n        const separator = url.includes('?') ? '&' : '?';\n        await navigateTo(page, `${url}${separator}_opencli=${Date.now()}`, 5);\n        await page.wait(1);\n        const captures = await page.readNetworkCapture();\n        for (const entry of Array.isArray(captures) ? captures : []) {\n            if (!String(entry?.url || '').includes('joblist.json') ||\n                Number(entry?.responseStatus || 0) !== 200 ||\n                typeof entry?.responsePreview !== 'string') {\n                continue;\n            }\n            let payload;\n            try {\n                payload = JSON.parse(entry.responsePreview);\n            } catch {\n                continue;","sourceCodeStart":80,"sourceCodeEnd":116,"githubUrl":"https://github.com/jackwener/OpenCLI/blob/49907e53dc3ade5c223ff0c4c2c2785687cec4e6/clis/boss/search.js#L80-L116","documentation":"captureJobList requires the page object to expose CDP network capture (startNetworkCapture/readNetworkCapture) so it can intercept BOSS's job-list JSON response instead of scraping HTML. If those methods are missing or startNetworkCapture('joblist.json') fails, it throws this CommandExecutionError.","triggerScenarios":"Calling boss search with a page object that is not a CDP-capable browser page (mock, plain Puppeteer page without the extension API, or a session where starting the capture failed e.g. target already closed or another capture is active).","commonSituations":"Passing a bare puppeteer.Page instead of the library's wrapped page; running in an environment without DevTools protocol access (already-attached debugger, restricted webview); stale/crashed browser target; using an older library version whose page wrapper lacks capture support.","solutions":["Pass the library's wrapped browser page object (the one with startNetworkCapture/readNetworkCapture) to the command","Re-launch the browser session — a crashed or closed target makes startNetworkCapture return false","Ensure no other CDP client/debugger is already attached to the page","Upgrade @jackwener/opencli to a version where the page wrapper provides CDP capture","Verify the page is a live browser page (requirePage passes) and not a mock/test double"],"exampleFix":"// before\nconst page = await puppeteer.launch().newPage();\nawait cli('boss', 'search', { query: 'node' }); // page passed internally lacks capture\n// after: use the library's browser/page wrapper\nconst page = await opencli.browser.getPage();\nawait cli('boss', 'search', { query: 'node' });","handlingStrategy":"type-guard","validationCode":"const supportsCapture = typeof page.startNetworkCapture === 'function' &&\n  typeof page.readNetworkCapture === 'function';\nif (!supportsCapture) throw new Error('need a CDP-capable page from the library wrapper');","typeGuard":"function isCdpPage(page) {\n  return Boolean(page) && typeof page.startNetworkCapture === 'function' &&\n    typeof page.readNetworkCapture === 'function';\n}","tryCatchPattern":"try {\n  return await cli('boss', 'search', opts);\n} catch (e) {\n  if (String(e.message).includes('CDP network capture')) {\n    await reopenBrowserSession(); // relaunch page\n    return cli('boss', 'search', opts);\n  }\n  throw e;\n}","preventionTips":["Always pass the library's wrapped page, not a raw puppeteer page","Keep only one CDP client attached to the target","Relaunch stale browser sessions before batch jobs","Pin a library version known to expose capture APIs"],"tags":["cdp","network-capture","environment"],"backgroundTag":"cdp-capture-unavailable","analyzedSha":"49907e53dc3ade5c223ff0c4c2c2785687cec4e6","analyzedAt":"2026-08-29T08:14:47.543Z","schemaVersion":2},"datasetVersion":"2026-08-29T12:17:43.993Z"}