onBeforeUnload не запускается из безголового браузера - PullRequest
0 голосов
/ 13 июня 2018

Я использую pupeteer для работы с безголовым хромом на nodeJS.

Я перемещаюсь по локальному веб-сайту и собираю содержимое, читаю все привязанные 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 в последнюю очередь на странице как в безголовых браузерах, так и в обычных браузерах?

Спасибо

1 Ответ

0 голосов
/ 14 июня 2018

Поскольку pptr v1.4.0 , вы можете передать опцию runBeforeUnload методу page.close:

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