是否有一个Puppeteer替代PhantomJS onInitialized在页面加载之前进行评估?

时间:2018-03-12 19:32:26

标签: node.js phantomjs puppeteer

我有一个程序正在使用PhantomJS onInitialized方法来设置页面可以在首次加载时使用的窗口全局变量。我还没有找到办法用木偶操作者做到这一点。在创建页面之后但在转到页面之前调用evaluate会重置变量。在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 个答案:

答案 0 :(得分:2)

我认为PhantomJS onInitialized的等效API实际上是通过Browser :: targetcreated事件实现的:

  

创建目标时发出,例如当window.openbrowser.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();
})();

答案 1 :(得分:1)

显然页面框架已经开始了#39;活动是胜利者:

  page.on('framenavigated', msg => {
    page.evaluate(pageParams => {
      window.sharedConfig = 3;
    }, pageParams);
  });