使用 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();
})();