首页 > 解决方案 > onBeforeUnload 没有被无头浏览器触发

问题描述

我正在使用 pupeteer 在 nodeJS 上使用无头 Chrome。

我正在浏览本地网站并抓取内容,读取所有锚<a>URL 并将其内容保存在文件中。

const puppeteer = require('puppeteer'); 
const { URL } = require('url');
const fse = require('fs-extra'); 
const path = require('path');


puppeteer.launch().then(async browser => {
  const page = await browser.newPage();
  //Navigate to local website
  await page.goto('http://localhost:5976/',{"waitUntil": "networkidle0"});  

  //Gather all anchors on my webpage and save their URLs in an array
  const hrefs = await page.evaluate(() => {
      const anchors = document.querySelectorAll('a');
      return [].map.call(anchors, a => a.href);
    });
  browser.close();

  //Loop through all the URLs and call them
  for (var i = 0; i < hrefs.length; i++) {
     start(hrefs[i]);
  }

})

//Function to browse URL
async function start(urlToFetch) {

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

  page.on('response', async (response) => {

     //Treat content of page

  });

  await page.goto(urlToFetch, {
    waitUntil: 'networkidle2'
  });

  setTimeout(async () => {
    await browser.close();
  }, 60000 * 4);
}

另一方面,在我的本地网站中,对于我正在执行 AJAX 调用的每个页面

$(window).on("beforeunload", function() {  
    //AJAX call
};

我发现如果我从浏览器浏览我的网站,当我离开每个页面时都会执行此 AJAX 调用。但是当我通过上面的 NodeJS 代码从无头浏览器浏览我的网站时,不会调用 AJAX 调用

为了验证,我将 AJAX 调用放入DOMContentLoaded事件中,它是从无头浏览器调用的。所以问题在于onBeforeUnload

可能是在我的 nodeJS 代码中,我没有关闭每个页面,因此没有调用该事件。

我想知道我可以将事件更改为什么,以便在无头浏览器和普通浏览器的页面上调用 AJAX 的最后一件事?

标签: javascriptnode.jsdom-eventspuppeteeronbeforeunload

解决方案


pptr v1.4.0 开始,您可以将runBeforeUnload选项传递给该page.close方法:

await page.close({runBeforeUnload: true});

推荐阅读