puppeteer 中缺少请求标头

Bar*_*rdt 10 cookies request-headers http-headers puppeteer

我想在使用 puppeteer 编写的测试期间读取请求 cookie。但我注意到我检查的大多数请求只有引用和用户代理标头。如果我在 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();
Run Code Online (Sandbox Code Playgroud)

您可以访问和不能访问哪些请求标头是否有限制?是Chrome本身的限制还是puppeteer的限制?

感谢您的建议!

Hug*_*ugo 11

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

环顾 GitHub 问题,我发现了一个问题,其中提到 Puppeteer 不侦听底层 Chrome DevTools 协议的Network.responseReceivedExtraInfo事件,此事件提供了Network.responseReceived事件不可用的额外响应标头。对于请求,还有一个类似的Network.requestWillBeSentExtraInfo事件。

连接到这些事件似乎让我得到了我需要的所有标题。下面是一些示例代码,它从所有这些事件中捕获数据并将其合并到由请求 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
}
Run Code Online (Sandbox Code Playgroud)