Puppeteer 的 page.cookies() 没有检索 Chrome 开发工具中显示的所有 cookie

Pie*_*ick 3 google-chrome-devtools puppeteer

使用 puppeteer,我试图https://google.com从 Node.js检索特定网站(即)的所有 cookie 。

我的代码是:

// Launch browser and open a new page
const browser = await puppeteer.launch({ headless: true, args: ['--disable-dev-shm-usage'] });
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle2' });
var cookies = await page.cookies();
console.log(cookies);
await browser.close();
Run Code Online (Sandbox Code Playgroud)

它只检索 2 个 cookie,命名为1P_JARNID。但是,当我打开 Chrome Dev 工具时,它显示了更多内容。

我尝试直接使用 Chrome Dev Tools 而不是 puppeteer,但我得到了相同的结果。

我应该调用另一个函数吗?我做得对吗?

And*_*ris 17

page.cookies()调用仅获取可用于浏览器中的 JavaScript 应用程序的 cookie,而不是httpOnly您在 Chrome DevTools 中看到的标记为 的 cookie。解决方案是通过 Devtools 协议请求所有可用的 cookie,然后过滤您感兴趣的站点。

var data = await page._client.send('Network.getAllCookies');
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是,由于 _client 是私有的,因此似乎不适用于打字稿 (2认同)

小智 14

您可以利用Chrome DevTools Protocol -> getAllCookies 来获取所有浏览器 cookie,无论任何标志如何。

const client = await page.target().createCDPSession();
const cookies = (await client.send('Network.getAllCookies')).cookies;
Run Code Online (Sandbox Code Playgroud)

这也可以很好地与 typescript 和 tslint 配合使用,因为类似

const cookies = await page._client.send('Network.getAllCookies');
Run Code Online (Sandbox Code Playgroud)

会引发错误TS2341: Property '_client' is private and only accessible within class 'Page'.