rod icon indicating copy to clipboard operation
rod copied to clipboard

screentshot with scroll

Open chyroc opened this issue 3 years ago • 0 comments

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

chyroc avatar Sep 02 '21 11:09 chyroc