Puppeteer的page.cookies()不会检索Chrome开发工具中显示的所有Cookie

时间:2018-03-20 16:42:37

标签: google-chrome-devtools puppeteer

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

我的代码是:

// 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();

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

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

我应该打电话给另一个功能吗?我这样做了吗?

3 个答案:

答案 0 :(得分:6)

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

var data = await page._client.send('Network.getAllCookies');

答案 1 :(得分:1)

谢谢@ try-catch-finally。我得到了解决,这是一个简单的菜鸟错误。 我将自己的Google Chrome实例中的Cookie与Puppeteer实例进行比较。但是,在我的实例中,我登录了我的Google帐户,而Puppeteer(显然)则没有。 当您未登录时,Google会使用2个Cookie,而当您登录时,则会使用12个。

答案 2 :(得分:0)

如果您使用 Playwright 代替 Puppeteer,则可以轻松访问 httponly cookie:

const { chromium } = require('playwright')
(async () => {
    const browser = await chromium.launch()
    const context = await browser.newContext()
    const page = await context.newPage()
    await page.goto('https://google.com', { waitUntil: 'networkidle' })
    let allCookies = await context.cookies()
    console.log (allCookies)
})();

返回:

[
  {
    sameSite: 'None',
    name: '1P_JAR',
    value: '2021-01-27-19',
    domain: '.google.com',
    path: '/',
    expires: 1614369040.389115,
    httpOnly: false,
    secure: true
  },
  {
    sameSite: 'None',
    name: 'NID',
    value: '208=VXtmbaUL...',
    domain: '.google.com',
    path: '/',
    expires: 1627588239.572781,
    httpOnly: true,
    secure: false
  }
]