Skip to content

Instantly share code, notes, and snippets.

@ianjennings
Created June 8, 2026 14:32
Show Gist options
  • Select an option

  • Save ianjennings/bd9818f3e249bbb848c10a9da046aee5 to your computer and use it in GitHub Desktop.

Select an option

Save ianjennings/bd9818f3e249bbb848c10a9da046aee5 to your computer and use it in GitHub Desktop.
TestDriver CDP Cookie Auth
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