使用 Puppeteer 的 HTTP 响应日期无效
Invalid HTTP-response date using Puppeteer
我目前正在尝试优化刷新网页的时间,因此分析了 request/response 次:
我注意到使用此代码示例会出现以下问题:
如果我在预定义的时间刷新网站,网络浏览器收到的第一个响应是在触发刷新之前创建的。因此,例如,如果我在 8:00:00 触发刷新,则第一个响应是在 7:59:59 创建的,但它应该是在刷新之后的某个时间。
为了更好地理解这个问题,我创建了这个代码示例:
const browser = await puppeteer.launch(
{
headless: false,
defaultViewport: {
width: 1400,
height: 2000,
deviceScaleFactor: 1
}
});
const page = await browser.newPage();
await page.goto('https://www.google.at/');
//wait two seconds to load page
await page.waitForTimeout(2000);
let firstResponse = true;
page.on('response', response => {
if (firstResponse){
const delay = Date.now() - starttime.getTime();
const head = response.headers();
console.log(head.date);
console.log("first response happened:");
console.log("delay between refresh and first response: " + delay + "ms");
firstResponse = false;
}
});
//predefining the time to refresh the page
const starttime = new Date(2021, 11, 27, 0, 7, 0, 0);
console.log(starttime);
const waitingtime = starttime.getTime() - Date.now();
await page.waitForTimeout(waitingtime);
console.log("reload starts");
await page.reload();
await browser.close();
这是控制台上的输出:
(第一行是puppeteer刷新页面的时间,第三行是响应日期)
2021-12-26T23:07:00.000Z
reload starts
Sun, 26 Dec 2021 23:06:59 GMT
first response happened:
delay between refresh and first response: 151ms
所以根据这个例子,第一个响应应该在 23:07:00:000 和 23:07:00:151 (hh:mm:ss:ms) 之间而不是之前创建。
我在监督这里吗?我只是想不通为什么会这样!
我亲自对其进行了测试,但没有得到相同的结果。
我很确定你实际上没有在重新加载时重置响应时间戳,你实际上使用的是来自初始请求的时间戳,这可以解释为什么响应时间戳已过时。
firstResponse
变量未正确重置。在第一次加载时我们有 firstResponse = false
,但在重新加载时它没有重置为 true
。
let puppeteer = require(`puppeteer`);
(async () => {
//start...
console.log(`\u001b[1;32m` + `Start @: ${new Date(Date.now())}` + `\u001b[0m`);
let browser = await puppeteer.launch({
headless: false,
});
let page = await browser.newPage(); (await browser.pages())[0].close();
//request...
let req = 0;
page.on(`request`, (page => {
req++;
if (req === 1)
console.log(`\u001b[1;35m` + `Request @: ${new Date(Date.now())}` + `\u001b[0m`);
}));
//response...
let res = 0;
page.on(`response`, (page => {
res++;
if (res === 1)
console.log(`\u001b[1;36m` + `Response @: ${new Date(Date.now())}` + `\u001b[0m`);
}));
await page.goto('https://www.google.at/');
//reset...
req = 0,
res = 0;
//reload...
console.log(`\u001b[1;33m` + `Reload @: ${new Date(Date.now())}` + `\u001b[0m`);
await page.reload();
//close...
console.log(`\u001b[1;31m` + `Close @: ${new Date(Date.now())}` + `\u001b[0m`);
await browser.close();
})();
我目前正在尝试优化刷新网页的时间,因此分析了 request/response 次: 我注意到使用此代码示例会出现以下问题:
如果我在预定义的时间刷新网站,网络浏览器收到的第一个响应是在触发刷新之前创建的。因此,例如,如果我在 8:00:00 触发刷新,则第一个响应是在 7:59:59 创建的,但它应该是在刷新之后的某个时间。
为了更好地理解这个问题,我创建了这个代码示例:
const browser = await puppeteer.launch(
{
headless: false,
defaultViewport: {
width: 1400,
height: 2000,
deviceScaleFactor: 1
}
});
const page = await browser.newPage();
await page.goto('https://www.google.at/');
//wait two seconds to load page
await page.waitForTimeout(2000);
let firstResponse = true;
page.on('response', response => {
if (firstResponse){
const delay = Date.now() - starttime.getTime();
const head = response.headers();
console.log(head.date);
console.log("first response happened:");
console.log("delay between refresh and first response: " + delay + "ms");
firstResponse = false;
}
});
//predefining the time to refresh the page
const starttime = new Date(2021, 11, 27, 0, 7, 0, 0);
console.log(starttime);
const waitingtime = starttime.getTime() - Date.now();
await page.waitForTimeout(waitingtime);
console.log("reload starts");
await page.reload();
await browser.close();
这是控制台上的输出: (第一行是puppeteer刷新页面的时间,第三行是响应日期)
2021-12-26T23:07:00.000Z
reload starts
Sun, 26 Dec 2021 23:06:59 GMT
first response happened:
delay between refresh and first response: 151ms
所以根据这个例子,第一个响应应该在 23:07:00:000 和 23:07:00:151 (hh:mm:ss:ms) 之间而不是之前创建。
我在监督这里吗?我只是想不通为什么会这样!
我亲自对其进行了测试,但没有得到相同的结果。
我很确定你实际上没有在重新加载时重置响应时间戳,你实际上使用的是来自初始请求的时间戳,这可以解释为什么响应时间戳已过时。
firstResponse
变量未正确重置。在第一次加载时我们有 firstResponse = false
,但在重新加载时它没有重置为 true
。
let puppeteer = require(`puppeteer`);
(async () => {
//start...
console.log(`\u001b[1;32m` + `Start @: ${new Date(Date.now())}` + `\u001b[0m`);
let browser = await puppeteer.launch({
headless: false,
});
let page = await browser.newPage(); (await browser.pages())[0].close();
//request...
let req = 0;
page.on(`request`, (page => {
req++;
if (req === 1)
console.log(`\u001b[1;35m` + `Request @: ${new Date(Date.now())}` + `\u001b[0m`);
}));
//response...
let res = 0;
page.on(`response`, (page => {
res++;
if (res === 1)
console.log(`\u001b[1;36m` + `Response @: ${new Date(Date.now())}` + `\u001b[0m`);
}));
await page.goto('https://www.google.at/');
//reset...
req = 0,
res = 0;
//reload...
console.log(`\u001b[1;33m` + `Reload @: ${new Date(Date.now())}` + `\u001b[0m`);
await page.reload();
//close...
console.log(`\u001b[1;31m` + `Close @: ${new Date(Date.now())}` + `\u001b[0m`);
await browser.close();
})();