Как я могу использовать кукловод, чтобы сделать полные скриншоты нескольких сайтов? - PullRequest
1 голос
/ 28 июня 2019

Я пытаюсь сделать скриншот, используя Node.js с puppeteer .Я не использую page.screenshot(), потому что скриншот должен содержать весь рабочий стол.Вместо этого я делаю снимок экрана с помощью команды ImageMagick import.

Мой текущий код работает большую часть времени.Но в других случаях происходит сбой со странными результатами, такими как:

  • Вкладка переключается, но скриншот содержит половину старой страницы.
  • Страница переключена, но пуста.
  • Добавление задержки работает, но не идеально, потому что иногда загрузка страницы очень медленная.

Кажется, проблема вчто page.bringToFront() не ожидает полной загрузки страницы.

Я новичок как в Node, так и в кукловоде.Пожалуйста, предложите способ:

  1. Загрузить страницу в Chrome.
  2. Перейти на страницу после загрузки.
  3. Сделать снимок рабочего стола, выполнив команду-line tool.

Добавление задержки в код не является лучшим решением.

Любые предложения по улучшению кода будут полезны.

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')
}

Страница переадресации не загружена полностью без сна

1 Ответ

1 голос
/ 28 июня 2019

Вы все путаете, пытаясь запустить все параллельно с Promise.all.Поскольку у вас есть только один экземпляр browser, когда вы запускаете grabpage 3 раза параллельно, все они соревнуются за контроль над браузером и могут попасть между await s.

Iтакже предлагает открывать и закрывать отдельные страницы в grabpage.Вы должны были бы переключить его на пропуск browser и выполнить const page = await browser.newPage();

, чтобы в итоге вы получили

(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 grabpage(browser, 'https://www.cnn.com', 'cnn'),
    await grabpage(browser, 'https://www.bbc.com', 'bbc'),
    await grabpage(browser, 'https://www.rediff.com', 'rediff'),
})();

async function grabpage(browser, url, path) {
  const page = await browser.newPage();
  await page.goto(url);
  execSync('import -window root ' + path +'.jpg')
  // await page.screenshot({path: `${path}.png`}); //if you just need to take a screenshot, not the whole desktop
  await page.close();
}

, не зная, зачем вам нужен полный рабочий стол, хотяесли вы start-maximized.Я полагаю, вам небезразличен крошечный OS Chrome, который вы видите на скриншоте.

...