【问题标题】:Is there a way to override "tab closing" in puppeteer cluster?有没有办法覆盖 puppeteer 集群中的“标签关闭”?
【发布时间】:2019-06-25 05:55:33
【问题描述】:

Puppeteer 集群在我截屏之前关闭选项卡。

我正在使用 maxConcurrency 8 的 puppeteer 集群。我需要在每个页面加载后截取屏幕截图[大约。 20000 个网址]。 Page.screenshot 对我没有用。我的屏幕截图应该包括 URL 栏和桌面。它基本上就像一个完整的桌面截图。所以我使用 ImageMagick 来截屏,(和 xvfb 用于多屏幕管理)

问题是:

  1. 有时,在切换到右侧选项卡之前会截取屏幕截图。
  2. 空白截图,因为当前选项卡已关闭,尚未加载的选项卡出现在最前面。
  3. 有时,由于所有选项卡都已关闭,导致无法截取屏幕截图而引发错误。

我正在做的是:当每个页面加载时,我调用 page.bringToFront 并生成一个 child_process,它使用图像魔术导入命令截取桌面。

cluster.queue(postUrl.href); //for adding urls to queue
await page.waitForNavigation(); // Wait for page to load before screenshot

//taking screenshot
const { spawnSync} = require('child_process');
const child = spawnSync('import', [ '-window', 'root', path]);

不想在页面加载后设置等待时间,nodejs ImageMagick 不起作用,promise 似乎也不起作用。

我不希望木偶操纵者自行关闭标签。是否可以在页面加载完毕后给出回调事件,等待回调函数执行返回,然后关闭标签页??

【问题讨论】:

    标签: node.js puppeteer-cluster


    【解决方案1】:

    cluster.task函数的Promise一解析,页面就会关闭:

    await cluster.task(async ({ page, data }) => {
        // when this function is done, the page will be closed
    });
    

    要保持页面打开,您可以在关闭前等待另一个 Promise:

    await cluster.task(async ({ page, data }) => {
        // ...
        await new Promise(resolve => {
            // more code...
            // call resolve() when you are done
        });
    });
    

    最后调用resolve()函数将解析最后一个Promise,因此也解析整个async函数。因此,它将关闭页面。请记住,如果需要,您希望在启动集群时将 timeout 值增加到大于 30(默认值):

    const cluster = await Cluster.launch({
        // ...
        timeout: 120000 // 2 minutes
    });
    

    【讨论】:

      猜你喜欢
      • 2020-12-03
      • 2018-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多