Created
June 8, 2026 14:32
-
-
Save ianjennings/bd9818f3e249bbb848c10a9da046aee5 to your computer and use it in GitHub Desktop.
TestDriver CDP Cookie Auth
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| const CDP_CFG = { | |
| nodePath: 'NODE_PATH=/usr/lib/node_modules', | |
| cookieFile: '/tmp/chatgpt-session.json', | |
| }; | |
| const CDP_PORT = 9222; | |
| const SNIPPET = { | |
| listPages: ` const targets = await CDP.List({ port: ${CDP_PORT} }); | |
| const pages = targets.filter((t) => t.type === 'page');`, | |
| posthogPage: ` const target = pages.find((t) => /posthog\\.com/i.test(t.url || '')) || pages[0]; | |
| if (!target) throw new Error('no Chrome page target');`, | |
| chatgptPage: ` const target = | |
| pages.find((t) => /chatgpt\\.com/i.test(t.url || '')) || | |
| pages.find((t) => !/posthog\\.com/i.test(t.url || '')) || | |
| pages[0]; | |
| if (!target) throw new Error('no Chrome page target');`, | |
| posthogNavigatePage: ` const target = | |
| pages.find((t) => /posthog\\.com/i.test(t.url || '')) || | |
| pages.find((t) => !/chatgpt\\.com/i.test(t.url || '')) || | |
| pages[0]; | |
| if (!target) throw new Error('no Chrome page target');`, | |
| oauthPosthogPage: ` const target = | |
| pages.find((t) => /oauth\\.posthog\\.com/i.test(t.url || '')) || | |
| pages.find((t) => /posthog\\.com/i.test(t.url || '')) || | |
| pages[0]; | |
| if (!target) throw new Error('no Chrome page target');`, | |
| usPosthogPage: ` const target = | |
| pages.find((t) => /us\\.posthog\\.com/i.test(t.url || '')) || | |
| pages.find((t) => /posthog\\.com/i.test(t.url || '')) || | |
| pages[0]; | |
| if (!target) throw new Error('no Chrome page target');`, | |
| connect: ` const client = await CDP({ target, port: ${CDP_PORT} });`, | |
| waitLoad: (ms) => ` await new Promise((r) => { | |
| const t = setTimeout(r, ${ms}); | |
| Page.loadEventFired(() => { clearTimeout(t); r(); }); | |
| });`, | |
| }; | |
| function cdpScript(body, expectToken, logSuffix = '') { | |
| return ` | |
| const CDP = require('chrome-remote-interface'); | |
| (async () => { | |
| ${body} | |
| console.log('${expectToken}'${logSuffix}); | |
| await client.close(); | |
| process.exit(0); | |
| })().catch((e) => { console.error(e.message); process.exit(1); });`; | |
| } | |
| /** | |
| * @param {import('testdriverai').TestDriver} td | |
| * @param {object} opts | |
| */ | |
| export async function runCdpScript( | |
| td, | |
| { script, expectToken, scriptPath = '/tmp/cdp-run.js', runTimeoutMs = 60_000 }, | |
| ) { | |
| await td.exec('sh', `cat > ${scriptPath} << 'EOF'\n${script}\nEOF`, 15_000); | |
| const out = await td.exec( | |
| 'sh', | |
| `${CDP_CFG.nodePath} node ${scriptPath} 2>&1`, | |
| runTimeoutMs, | |
| ); | |
| if (expectToken && !String(out).includes(expectToken)) { | |
| throw new Error(`CDP script failed (expected "${expectToken}"): ${out}`); | |
| } | |
| return String(out); | |
| } | |
| export async function writeJsonToSandbox(td, remotePath, data) { | |
| const b64 = Buffer.from(JSON.stringify(data)).toString('base64'); | |
| const inline = `require('node:fs').writeFileSync(${JSON.stringify(remotePath)}, Buffer.from(${JSON.stringify(b64)}, 'base64'))`; | |
| await td.exec('sh', `node -e ${JSON.stringify(inline)}`, 120_000); | |
| } | |
| /** | |
| * @param {import('testdriverai').TestDriver} td | |
| * @param {object[]} cookies - Chrome export format | |
| * @param {{ navigateUrl?: string, cookiesOnly?: boolean, okTag?: string }} opts | |
| */ | |
| export async function injectCookies(td, cookies, opts = {}) { | |
| const { navigateUrl, cookiesOnly, okTag = 'COOKIE_INJECT_OK' } = opts; | |
| const onPosthogTab = cookiesOnly || /posthog/i.test(navigateUrl || ''); | |
| const onChatgptTab = navigateUrl && /chatgpt/i.test(navigateUrl); | |
| const targetPick = onPosthogTab | |
| ? `${SNIPPET.posthogPage}` | |
| : onChatgptTab | |
| ? `${SNIPPET.chatgptPage}` | |
| : ` let target = pages[0];`; | |
| const afterCookies = cookiesOnly | |
| ? '' | |
| : navigateUrl | |
| ? ` await Page.navigate({ url: ${JSON.stringify(navigateUrl)} }); | |
| ${SNIPPET.waitLoad(20_000)}` | |
| : ''; | |
| const script = ` | |
| const fs = require('node:fs'); | |
| const CDP = require('chrome-remote-interface'); | |
| function normalizeSameSite(value) { | |
| if (!value) return undefined; | |
| const v = String(value).toLowerCase(); | |
| if (v === 'no_restriction' || v === 'none') return 'None'; | |
| if (v === 'lax') return 'Lax'; | |
| if (v === 'strict') return 'Strict'; | |
| return undefined; | |
| } | |
| (async () => { | |
| const raw = fs.readFileSync(${JSON.stringify(CDP_CFG.cookieFile)}, 'utf-8'); | |
| const parsed = JSON.parse(raw); | |
| const out = parsed.map((c) => ({ | |
| name: c.name, | |
| value: c.value, | |
| domain: (c.domain || '').replace(/^\\./, ''), | |
| path: c.path || '/', | |
| secure: c.secure !== false, | |
| httpOnly: Boolean(c.httpOnly), | |
| sameSite: normalizeSameSite(c.sameSite), | |
| expires: c.expirationDate ? Math.floor(c.expirationDate) : undefined, | |
| })); | |
| ${SNIPPET.listPages} | |
| ${targetPick} | |
| if (!target) throw new Error('no Chrome page target'); | |
| const client = await CDP({ target, port: ${CDP_PORT} }); | |
| const { Network, Page } = client; | |
| await Network.enable(); | |
| await Page.enable(); | |
| await Network.setCookies({ cookies: out }); | |
| if (${cookiesOnly ? 'false' : 'true'}) { | |
| ${afterCookies} | |
| } | |
| console.log(${JSON.stringify(okTag)}, out.length); | |
| await client.close(); | |
| process.exit(0); | |
| })().catch((e) => { console.error(e.message); process.exit(1); });`; | |
| await writeJsonToSandbox(td, CDP_CFG.cookieFile, cookies); | |
| await runCdpScript(td, { script, expectToken: okTag, scriptPath: '/tmp/cdp-inject.js' }); | |
| } | |
| function posthogTargetSnippetForUrl(url) { | |
| if (/oauth\.posthog\.com/i.test(url || '')) return SNIPPET.oauthPosthogPage; | |
| if (/us\.posthog\.com/i.test(url || '')) return SNIPPET.usPosthogPage; | |
| return SNIPPET.posthogNavigatePage; | |
| } | |
| export async function ensureChromeRemoteInterface(td) { | |
| await td.exec('sh', 'sudo npm install -g chrome-remote-interface', 60_000); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment