有没有办法在操纵override群集中覆盖“制表符关闭”?

时间:2019-06-25 05:55:33

标签: node.js puppeteer-cluster

操纵者群集关闭选项卡之前,我无法截屏。

我正在使用具有maxConcurrency 8的puppeteer群集。加载每个页面后,我需要截屏。 20000个网址]。 Page.screenshot对我没有用。我的屏幕截图应包括网址栏和桌面。它基本上就像一个完整的桌面屏幕截图。因此,我使用ImageMagick进行屏幕截图,(使用xvfb进行多屏幕管理)

问题是:

  1. 有时,在切换到右侧选项卡之前会截取屏幕截图。
  2. 空白屏幕截图,因为当前标签页已关闭,尚未加载的标签页排在前面。
  3. 有时,由于所有选项卡均已关闭,因此由于无法拍摄屏幕截图而引发错误。

我正在做的是:加载每个页面时,我调用page.bringToFront并产生一个child_process,该进程使用image magic import命令获取桌面的屏幕截图。

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无效,并且承诺也似乎无效。

我不希望人偶自己关闭标签页。相反,一旦页面加载,它是否可以提供回调事件,等待回调函数执行并返回然后关闭选项卡?

1 个答案:

答案 0 :(得分:0)

解决cluster.task函数的承诺后,页面将关闭:

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
});