Node.js 使用tab和截图的木偶演员集群
我正在使用Puppeter clustor和imagemagick convert/xwd命令拍摄完整桌面的屏幕截图 需要具有页面可视部分的浏览器、浏览器导航按钮和URL。我可以得到截图的大多数时间,但它确实失败了其他时间 错误消息是选项卡已关闭,屏幕截图已完成。请说明我做错了什么 代码在linux上运行,X在显示器上运行:0.3。我看得出来 下面是我尝试阻止等待的代码Node.js 使用tab和截图的木偶演员集群,node.js,puppeteer,puppeteer-cluster,Node.js,Puppeteer,Puppeteer Cluster,我正在使用Puppeter clustor和imagemagick convert/xwd命令拍摄完整桌面的屏幕截图 需要具有页面可视部分的浏览器、浏览器导航按钮和URL。我可以得到截图的大多数时间,但它确实失败了其他时间 错误消息是选项卡已关闭,屏幕截图已完成。请说明我做错了什么 代码在linux上运行,X在显示器上运行:0.3。我看得出来 下面是我尝试阻止等待的代码 const { Cluster } = require('puppeteer-cluster'); const execS
const {
Cluster
} = require('puppeteer-cluster');
const execSync = require('child_process').execSync;
process.env['DISPLAY'] = ':0.3';
let i = 0;
function wait(time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
function blockingWait(seconds) {
//simple blocking technique (wait...)
var waitTill = new Date(new Date().getTime() + seconds * 1000);
while (waitTill > new Date()) {}
}
function getscreenshot(url, page) {
page.bringToFront(); // Get the tab to focus
wait(200);
i = i + 1; // For now get screenshot as number will add image named based on URL
path = i + '.jpg';
var r = execSync('import -window root ' + path);
console.log('Taken screenshot: ' + path);
console.log(url);
blockingWait(1);
}
(async () => {
// Create a cluster with 6 workers or 6 tabs which loads all the url
const cluster = await Cluster.launch({
concurrency: Cluster.CONCURRENCY_PAGE,
maxConcurrency: 6,
timeout: 120000,
puppeteerOptions: {
executablePath: 'google-chrome-stable',
args: [
'--ignore-certificate-errors',
'--no-sandbox',
'--incognito',
'--disable-infobars',
'--disable-setuid-sandbox',
'--window-size=1600,1200',
'--start-maximized',
'--disable-gpu'
],
headless: false, //headless:false so we can watch the browser as it works
},
});
console.log('cluster launched');
// We don't define a task and instead use own functions
const screenshot = async ({
page,
data: url
}) => {
console.log('screenshot entered ');
await page.setExtraHTTPHeaders({
'CUSTOMER-ID': "66840"
}, ); // use same customer id as header
await page.setViewport({
width: 1600,
height: 1200
});
await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3419.0 Safari/537.36');
await page.goto(url, {
waitUntil: 'domcontentloaded'
}, {
waitUntil: 'networkidle0'
}, {
waitUntil: 'load'
});
// Since we wait the page to fully load
await page.waitForResponse(response => response.ok()) // ok page is ready .. will deal here for other HTTP error beside 200, 404,500 etc
await page.waitForNavigation({
waitUntil: 'domcontentloaded'
}, {
waitUntil: 'networkidle0'
}, ); // Wait for page to load before screenshot
await page.bringToFront(); // Get the tab to focus
wait(100); // Blocking wait
console.log('Waiting 5 sec');
blockingWait(5); // different kind of wait
getscreenshot(url, page);
console.log('screenshot exited');
};
const extractTitle = async ({
page,
data: url
}) => {
console.log('scrapelinks entered');
await page.setExtraHTTPHeaders({
'CUSTOMER-ID': "66840"
}, );
await page.setViewport({
width: 1600,
height: 1200
});
await page.goto(url);
const pageTitle = await page.evaluate(() => document.title); // will later used to confirm the page matches with client details.
// get all Links on the page
const hrefs = await page.$$eval('a', hrefs => hrefs.map((a) => {
return {
href: a.href,
text: a.textContent,
};
}));
// get 1st links matching text or link value having bioanalyzer-systems/instrument-2100.xhtml
for (let postUrl of hrefs) {
if (postUrl.text.indexOf("Client-s") > -1) {
cluster.execute(postUrl.href, screenshot); // add this link also to queue
} else if (postUrl.href.indexOf("bioanalyzer-systems/instrument-2100.xhtml") > -1) {
cluster.execute(postUrl.href, screenshot); // add this url to queue
break;
}
}
console.log('scrapelinks exited');
};
// Make screenshots
cluster.execute('http://www.internal-site.int/en/product/66840?product=NEW&CodeList=bio&Id=66840', screenshot);
cluster.execute('http://www.internal-site.int/en/product/66840?product=USED&CodeList=nonbio&Id=66840', screenshot);
// But also do some other stuff
cluster.execute('http://www.internal-site.int/en/product/66840?product=NEW&CodeList=bio&Id=66840', extractTitle);
cluster.execute('http://www.internal-site.int/en/product/66840?product=USED&CodeList=nonbio&Id=66840', extractTitle);
await cluster.idle();
await cluster.close();
})();```
I expect output to take screenshot once the page or tab load is completed.
函数完成执行或承诺得到解决后,页面将立即关闭。您没有使用wait来等待异步操作完成 例如,在屏幕截图函数中,有以下代码: 等待100; 控制台。记录“等待5秒”; 阻断wait5; getscreenshoturl,页面; 控制台。日志“屏幕截图退出”; 第一行调用异步的wait函数,但由于您没有等待它,该函数将在后台执行,Node.js将继续执行您的脚本 blockingWait不是类似JavaScript的代码编写方式。这完全阻碍了执行 getscreenshot函数也应该是异步的,这样您就可以等待它了。此外,一些puppeter函数调用应该在前面等待,例如page.bringToFront,以等待它们完成
一般来说,您应该了解/的概念,并承诺了解应该在何处以及为什么使用这些关键字。我不知道如何解决这个问题。我在另一篇文章中提到了“承诺”。但是,它不起作用。等待page.bringToFront;然后截图。但这没有帮助。类似于“`wait Promise.all[page.bringToFront,execSync'import-windowroot'+path+'.jpg',screenshotpage,url,console.logclosing page:${url},page.close,]”;`。。任何关于如何将页面放在前面的建议。。等待页面完全显示,然后使用import imagemagick实用程序拍摄屏幕截图。