【发布时间】:2019-11-09 23:24:13
【问题描述】:
我正在尝试使用带有puppeteer 的 Node.js 截屏。我没有使用page.screenshot(),因为屏幕截图需要包含整个桌面。相反,我使用 ImageMagick 的 import 命令截屏。
我当前的代码大部分时间都有效。但其他时候,它会以奇怪的结果失败,例如:
- 选项卡已切换,但屏幕截图包含旧页面的一半。
- 页面已切换但空白。
- 添加延迟有效,但并不理想,因为有时页面加载速度很慢。
问题似乎是page.bringToFront() 没有等待页面完全加载。
我是 Node 和 puppeteer 的新手。请提出一种方法:
- 在 Chrome 中加载页面。
- 加载后切换到页面。
- 通过执行命令行工具截取桌面截图。
在代码中添加延迟似乎不是最好的解决方案。
任何关于代码改进的建议都会有所帮助。
const puppeteer = require('puppeteer');
const execSync = require('child_process').execSync;
const sleep = require('sleep');
(async () => {
const browser = await puppeteer.launch({
headless: false,
args: [
'--ignore-certificate-errors',
'--no-sandbox',
'--disable-infobars',
'--disable-setuid-sandbox',
'--incognito',
'--window-size=1600,1200',
'--start-maximized',
"--disable-gpu"],
// slowMo: 250, // slow down by 1550ms
});
await browser.newPage();
await browser.newPage();
const pages = await browser.pages();
await Promise.all([
grabpage(pages[0], 'https://www.cnn.com', 'cnn'),
grabpage(pages[1], 'https://www.bbc.com', 'bbc'),
grabpage(pages[2], 'https://www.rediff.com', 'rediff'),
]);
// Someday we will close the browser also.
})();
async function grabpage(page, url, path) {
await page.goto(url);
var infront =page.bringToFront();
infront.then(
sleep.sleep(5),
execSync('import -window root ' + path +'.jpg'),
);
console.log('took Screenshot: '+path+'.jpg')
}
【问题讨论】:
标签: javascript node.js puppeteer browser-automation