Puppeteer 集群在我截取屏幕截图之前关闭了选项卡。
我正在使用 maxConcurrency 8 的 puppeteer 集群。我需要在每个页面加载后截取屏幕截图[大约。 20000 个网址]。 Page.screenshot 对我来说没有用。我的屏幕截图应该包括地址栏和桌面。它基本上就像一个完整的桌面屏幕截图。所以我使用 ImageMagick 来截屏,(使用 xvfb 进行多屏幕管理)
问题是:
- 有时,会在切换到右侧选项卡之前截取屏幕截图。
- 空白屏幕截图,因为当前选项卡已关闭,尚未加载的选项卡出现在前面。
- 有时,由于所有选项卡都已关闭,因此无法截取屏幕截图,从而引发错误。
我正在做的是:当每个页面加载时,我调用 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 不起作用,并且 Promise 似乎也不起作用。
我不希望木偶操纵者自行关闭选项卡。相反,是否可以在页面加载后给出回调事件,等待回调函数执行并返回,然后关闭选项卡?
最佳答案
一旦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
});
关于node.js - 有没有办法覆盖 puppeteer 集群中的 "tab closing"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56747648/