Есть ли способ переопределить «закрытие вкладки» в кластере кукловодов? - PullRequest
1 голос
/ 25 июня 2019

Закрытие вкладок кластера кукловодов до того, как я смогу сделать скриншот.

Я использую кластер кукловодов с maxConcurrency 8. Мне нужно делать снимок экрана после каждой загрузки страницы [Прибл.20000 URL].Page.screenshot для меня бесполезен.Мой скриншот должен включать в себя строку URL и рабочий стол.Это в основном как полный скриншот рабочего стола.Поэтому я использую ImageMagick для создания снимка экрана (и xvfb для управления несколькими экранами)

Проблема заключается в следующем:

  1. иногда снимок экрана выполняется перед переключением на правую вкладку.
  2. пустой снимок экрана, потому что текущая вкладка закрыта, а вкладка, которая еще не загружена, выходит вперед.
  3. иногда возникает ошибка, поскольку снимок экрана не может быть сделан, поскольку все вкладки были закрыты.

Что я делаю: когда загружается каждая страница, я вызываю page.bringToFront и вызываю child_process, который делает снимок рабочего стола с помощью команды импорта изображений image magic *.

cluster.queue(postUrl.href); //for adding urls to queue
await page.waitForNavigation(); // Wait for page to load before screenshot

//taking screenshot
const { spawnSync} = require('child_process');
const child = spawnSync('import', [ '-window', 'root', path]);

Не хочу устанавливать время ожидания после загрузки страницы, nodejs ImageMagick не работал, и обещание также, похоже, не работало.

Я не хочу, чтобы кукловод закрывал вкладку самостоятельно.Вместо этого, может ли он выдать событие обратного вызова после загрузки страницы, подождать, пока функция обратного вызова не будет выполнена и возвращена, а затем вкладка закрыта ??

1 Ответ

0 голосов
/ 25 июня 2019

Как только Обещание функции cluster.task разрешено, страница будет закрыта:

await cluster.task(async ({ page, data }) => {
    // when this function is done, the page will be closed
});

Чтобы сохранить страницу открытой, вы можете дождаться следующего Обещания в конце перед закрытием:

await cluster.task(async ({ page, data }) => {
    // ...
    await new Promise(resolve => {
        // more code...
        // call resolve() when you are done
    });
});

Вызов функции resolve() в конце разрешит последнее Обещание и, следовательно, также разрешит всю функцию async.Поэтому он закроет страницу.Помните, что при запуске кластера вы хотите увеличить значение timeout до значения, превышающего 30 (по умолчанию):

const cluster = await Cluster.launch({
    // ...
    timeout: 120000 // 2 minutes
});
...