У меня есть программа, которая использует метод PhantomJS onInitialized для установки глобальная переменная окна, которую страница может использовать при первой загрузке. Я пока не смог найти способ сделать это с кукольником. Вызов оценки после создания страницы, но перед переходом на страницу сбрасывает переменную. Делать это в domcontentloaded, похоже, уже слишком поздно.

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

  await page.evaluate(pageParams => {
    window.sharedConfig = 1; // Sets it but gets reset when the page loads
  }, pageParams);

  page.on('domcontentloaded', msg => {
    page.evaluate(pageParams => {
      window.sharedConfig = 2; // Sets it but it's too late
    }, pageParams);
  });

  let pageResult = await page.goto(url);

  await page.evaluate(pageParams => {
    window.sharedConfig = 3; // Def too late
  }, pageParams);
2
DShook 12 Мар 2018 в 22:32

2 ответа

Лучший ответ

Я думаю, что эквивалентный API для PhantomJS onInitialized на самом деле достигается с помощью событие Browser :: targetcreated:

Излучается при создании цели, например, когда новая страница открывается с помощью window.open или browser.newPage.

Пример инициализации window.sharedConfig для всех вновь созданных страниц:

(async () => {
  const browser = await puppeteer.launch();

  browser.on('targetcreated', async target => {
    const page = await target.page();
    await page.evaluate(() => {
      window.sharedConfig = 0;
    });
  });

  const page = browser.newPage();
  await page.evaluate(() => console.log(window.sharedConfig)); // => 0

  await browser.close();
})();

Если вам нужна дополнительная настройка страницы при навигации, вы можете использовать page.evaluateOnNewDocument():

Функция вызывается после создания документа, но до запуска любого из его сценариев. Это полезно для изменения среды JavaScript, например для заполнения Math.random.

Пример, который инициализирует window.sharedConfig, а затем изменяет это начальное значение при навигации по странице:

(async () => {
  const browser = await puppeteer.launch();

  browser.on('targetcreated', async target => {
    const page = await target.page();

    // Initialize window.sharedConfig for new page
    await page.evaluate(() => {
      window.sharedConfig = 0;
    });

    // Set window.sharedConfig when the page is navigated (before page loads)
    await page.evaluateOnNewDocument(() => {
      // window.sharedConfig === 0
      window.sharedConfig = 1;
    });
  });

  const page = browser.newPage();
  await page.evaluate(() => console.log(window.sharedConfig)); // => 0
  await page.goto('http://google.com');
  await page.evaluate(() => console.log(window.sharedConfig)); // => 1

  await browser.close();
})();
2
tony19 12 Мар 2018 в 21:49

Судя по всему, здесь побеждает событие с переходом по рамке:

  page.on('framenavigated', msg => {
    page.evaluate(pageParams => {
      window.sharedConfig = 3;
    }, pageParams);
  });
1
DShook 12 Мар 2018 в 20:37