在puppeteer

时间:2017-11-02 15:12:43

标签: cookies http-headers request-headers puppeteer

我想在与木偶操作员一起编写的测试中阅读请求cookie。但我注意到我检查的大多数请求只有referrer和user-agent头。如果我在Chrome开发工具中查看相同的请求,他们会有更多标题,包括Cookie。要查看它,请将以下代码复制粘贴到https://try-puppeteer.appspot.com/

const browser = await puppeteer.launch();
const page = await browser.newPage();

page.on('request', function(request) {
  console.log(JSON.stringify(request.headers, null, 2));
});

await page.goto('https://google.com/', {waitUntil: 'networkidle'});

await browser.close();

您是否可以访问请求标头的限制?这是Chrome本身或木偶操纵者的限制吗?

感谢您的建议!

2 个答案:

答案 0 :(得分:8)

当我尝试使用Puppeteer测试某些CORS行为时,我也看到了这一点-我发现某些请求中缺少Origin标头。

看看我发现an issue的GitHub问题,其中提到Puppeteer没有监听基础Chrome DevTools协议的Network.responseReceivedExtraInfo事件,该事件提供了{{ 3}}事件。还有一个类似的Network.responseReceived事件用于请求。

参加这些活动似乎使我获得了所需的所有标题。以下是一些示例代码,这些示例代码捕获所有这些事件中的数据并将其合并到以请求ID为键的单个对象中:

// Setup.
const browser = await puppeteer.launch()
const page = await browser.newPage()
const cdpRequestDataRaw = await setupLoggingOfAllNetworkData(page)

// Make requests.
await page.goto('http://google.com/')

// Log captured request data.
console.log(JSON.stringify(cdpRequestDataRaw, null, 2))

await browser.close()

// Returns map of request ID to raw CDP request data. This will be populated as requests are made.
async function setupLoggingOfAllNetworkData(page) {
    const cdpSession = await page.target().createCDPSession()
    await cdpSession.send('Network.enable')
    const cdpRequestDataRaw = {}
    const addCDPRequestDataListener = (eventName) => {
        cdpSession.on(eventName, request => {
            cdpRequestDataRaw[request.requestId] = cdpRequestDataRaw[request.requestId] || {}
            Object.assign(cdpRequestDataRaw[request.requestId], { [eventName]: request })
        })
    }
    addCDPRequestDataListener('Network.requestWillBeSent')
    addCDPRequestDataListener('Network.requestWillBeSentExtraInfo')
    addCDPRequestDataListener('Network.responseReceived')
    addCDPRequestDataListener('Network.responseReceivedExtraInfo')
    return cdpRequestDataRaw
}

答案 1 :(得分:0)

这是因为您的浏览器根据设置和功能设置了一堆标题,并且还包括例如它为特定页面本地存储的cookie。

如果要添加其他标头,可以使用以下方法:

page.setExtraHTTPHeaders docs here.

page.setUserAgent docs here.

page.setCookies docs here.

通过这些,您可以模仿您看到Chrome浏览器调度的额外标题。