Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 使用tab和截图的木偶演员集群_Node.js_Puppeteer_Puppeteer Cluster - Fatal编程技术网

Node.js 使用tab和截图的木偶演员集群

Node.js 使用tab和截图的木偶演员集群,node.js,puppeteer,puppeteer-cluster,Node.js,Puppeteer,Puppeteer Cluster,我正在使用Puppeter clustor和imagemagick convert/xwd命令拍摄完整桌面的屏幕截图 需要具有页面可视部分的浏览器、浏览器导航按钮和URL。我可以得到截图的大多数时间,但它确实失败了其他时间 错误消息是选项卡已关闭,屏幕截图已完成。请说明我做错了什么 代码在linux上运行,X在显示器上运行:0.3。我看得出来 下面是我尝试阻止等待的代码 const { Cluster } = require('puppeteer-cluster'); const execS

我正在使用Puppeter clustor和imagemagick convert/xwd命令拍摄完整桌面的屏幕截图

需要具有页面可视部分的浏览器、浏览器导航按钮和URL。我可以得到截图的大多数时间,但它确实失败了其他时间

错误消息是选项卡已关闭,屏幕截图已完成。请说明我做错了什么

代码在linux上运行,X在显示器上运行:0.3。我看得出来

下面是我尝试阻止等待的代码

const {
  Cluster
} = require('puppeteer-cluster');
const execSync = require('child_process').execSync;

process.env['DISPLAY'] = ':0.3';
let i = 0;

function wait(time) {
  return new Promise((resolve) => setTimeout(resolve, time));
}

function blockingWait(seconds) {
  //simple blocking technique (wait...)
  var waitTill = new Date(new Date().getTime() + seconds * 1000);
  while (waitTill > new Date()) {}
}

function getscreenshot(url, page) {
  page.bringToFront(); // Get the tab to focus 
  wait(200);
  i = i + 1; // For now get screenshot as number will add image named based on URL 
  path = i + '.jpg';
  var r = execSync('import -window root ' + path);
  console.log('Taken screenshot: ' + path);
  console.log(url);
  blockingWait(1);
}

(async () => {
  // Create a cluster with 6 workers or 6 tabs which loads all the url
  const cluster = await Cluster.launch({
    concurrency: Cluster.CONCURRENCY_PAGE,
    maxConcurrency: 6,
    timeout: 120000,
    puppeteerOptions: {
      executablePath: 'google-chrome-stable',
      args: [
        '--ignore-certificate-errors',
        '--no-sandbox',
        '--incognito',
        '--disable-infobars',
        '--disable-setuid-sandbox',
        '--window-size=1600,1200',
        '--start-maximized',
        '--disable-gpu'
      ],
      headless: false, //headless:false so we can watch the browser as it works
    },
  });
  console.log('cluster launched');

  // We don't define a task and instead use own functions
  const screenshot = async ({
    page,
    data: url
  }) => {
    console.log('screenshot entered ');
    await page.setExtraHTTPHeaders({
      'CUSTOMER-ID': "66840"
    }, ); // use same customer id as header
    await page.setViewport({
      width: 1600,
      height: 1200
    });
    await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/68.0.3419.0 Safari/537.36');
    await page.goto(url, {
      waitUntil: 'domcontentloaded'
    }, {
      waitUntil: 'networkidle0'
    }, {
      waitUntil: 'load'
    });
    // Since we wait the page to fully load

    await page.waitForResponse(response => response.ok()) // ok page is ready .. will deal here for other HTTP error beside 200, 404,500 etc 

    await page.waitForNavigation({
      waitUntil: 'domcontentloaded'
    }, {
      waitUntil: 'networkidle0'
    }, ); // Wait for page to load before screenshot
    await page.bringToFront(); // Get the tab to focus 
    wait(100); // Blocking wait
    console.log('Waiting 5 sec');
    blockingWait(5); // different kind of wait
    getscreenshot(url, page);
    console.log('screenshot exited');
  };

  const extractTitle = async ({
    page,
    data: url
  }) => {
    console.log('scrapelinks entered');
    await page.setExtraHTTPHeaders({
      'CUSTOMER-ID': "66840"
    }, );
    await page.setViewport({
      width: 1600,
      height: 1200
    });
    await page.goto(url);
    const pageTitle = await page.evaluate(() => document.title); // will later used to confirm the page matches with client details.
    // get all Links on the page
    const hrefs = await page.$$eval('a', hrefs => hrefs.map((a) => {
      return {
        href: a.href,
        text: a.textContent,
      };
    }));
    // get 1st links matching text or link value having bioanalyzer-systems/instrument-2100.xhtml
    for (let postUrl of hrefs) {
      if (postUrl.text.indexOf("Client-s") > -1) {
        cluster.execute(postUrl.href, screenshot); // add this link also to queue
      } else if (postUrl.href.indexOf("bioanalyzer-systems/instrument-2100.xhtml") > -1) {
        cluster.execute(postUrl.href, screenshot); // add this url to queue
        break;
      }
    }
    console.log('scrapelinks exited');
  };

  // Make screenshots
  cluster.execute('http://www.internal-site.int/en/product/66840?product=NEW&CodeList=bio&Id=66840', screenshot);
  cluster.execute('http://www.internal-site.int/en/product/66840?product=USED&CodeList=nonbio&Id=66840', screenshot);

  // But also do some other stuff
  cluster.execute('http://www.internal-site.int/en/product/66840?product=NEW&CodeList=bio&Id=66840', extractTitle);
  cluster.execute('http://www.internal-site.int/en/product/66840?product=USED&CodeList=nonbio&Id=66840', extractTitle);

  await cluster.idle();
  await cluster.close();
})();```

I expect output to take screenshot once the page or tab load is completed.

函数完成执行或承诺得到解决后,页面将立即关闭。您没有使用wait来等待异步操作完成

例如,在屏幕截图函数中,有以下代码:

等待100; 控制台。记录“等待5秒”; 阻断wait5; getscreenshoturl,页面; 控制台。日志“屏幕截图退出”; 第一行调用异步的wait函数,但由于您没有等待它,该函数将在后台执行,Node.js将继续执行您的脚本

blockingWait不是类似JavaScript的代码编写方式。这完全阻碍了执行

getscreenshot函数也应该是异步的,这样您就可以等待它了。此外,一些puppeter函数调用应该在前面等待,例如page.bringToFront,以等待它们完成


一般来说,您应该了解/的概念,并承诺了解应该在何处以及为什么使用这些关键字。

我不知道如何解决这个问题。我在另一篇文章中提到了“承诺”。但是,它不起作用。等待page.bringToFront;然后截图。但这没有帮助。类似于“`wait Promise.all[page.bringToFront,execSync'import-windowroot'+path+'.jpg',screenshotpage,url,console.logclosing page:${url},page.close,]”;`。。任何关于如何将页面放在前面的建议。。等待页面完全显示,然后使用import imagemagick实用程序拍摄屏幕截图。