我想在与木偶操作员一起编写的测试中阅读请求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本身或木偶操纵者的限制吗?
感谢您的建议!
答案 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浏览器调度的额外标题。