rod
rod copied to clipboard
screentshot with scroll
like js code with puppeteer:
const puppeteer = require('puppeteer');
const tempfile = require('tempfile');
async function scrollPage(page) {
await page.evaluate(() => {
const scrollStep = Math.floor(window.innerHeight / 2);
return new Promise((resolve, reject) => {
let preYOffset = -1;
let tryTime = 0;
function scrollDown() {
window.scrollBy(0, scrollStep);
if (window.pageYOffset === preYOffset) {
if (tryTime === 10) {
setTimeout(resolve, 500);
return;
} else {
tryTime += 1;
}
} else {
tryTime = 0;
}
preYOffset = window.pageYOffset;
setTimeout(scrollDown, 0);
}
setTimeout(reject, 300000);
scrollDown();
});
});
}
// 指定参数的
const factory = async (url, {fullPage, scroll, height, width, deletedSelectors}) => {
const filename = tempfile('.png');
let launchOptions = {
args: ['--no-sandbox', '--disable-setuid-sandbox']
};
if (fullPage) {
launchOptions = {
...launchOptions,
defaultViewport: null,
}
} else if (height && width) {
launchOptions = {
...launchOptions,
defaultViewport: {width, height},
}
}
const browser = await puppeteer.launch(launchOptions);
const page = await browser.newPage();
await page.goto(url);
if (deletedSelectors) {
await page.evaluate(async (deletedSelectors) => {
const deleteWithSelector = (sel) => {
var elements = document.querySelectorAll(sel);
for (var i = 0; i < elements.length; i++) {
elements[i].parentNode.removeChild(elements[i]);
}
};
deletedSelectors.forEach(v => {
deleteWithSelector(v);
});
}, deletedSelectors);
}
if (scroll) {
await scrollPage(page)
}
await page.screenshot({
fullPage: true,
path: filename,
});
// await page.pdf({path: filename, format: 'A4'});
await browser.close();
return filename
};
module.exports = {
factory,
};