2017-09-11 56 views
5

मैं Puppeteer का उपयोग कर रहा हूं ताकि सभी छवियों को लोड करने के बाद वेबसाइट का स्क्रीनशॉट लेने का प्रयास किया जा सके लेकिन इसे काम पर नहीं लाया जा सके।Puppeteer सभी छवियों को लोड करने के लिए प्रतीक्षा करें, फिर स्क्रीनशॉट लें

const puppeteer = require('puppeteer'); 

(async() => { 
    const browser = await puppeteer.launch(); 
    const page = await browser.newPage(); 
    await page.goto('https://www.digg.com/'); 

    await page.setViewport({width: 1640, height: 800}); 

    await page.evaluate(() => { 
     return Promise.resolve(window.scrollTo(0,document.body.scrollHeight)); 
    }); 

    await page.waitFor(1000); 

    await page.evaluate(() => { 
     var images = document.querySelectorAll('img'); 

     function preLoad() { 

      var promises = []; 

      function loadImage(img) { 
       return new Promise(function(resolve,reject) { 
        if (img.complete) { 
         resolve(img) 
        } 
        img.onload = function() { 
         resolve(img); 
        }; 
        img.onerror = function(e) { 
         resolve(img); 
        }; 
       }) 
      } 

      for (var i = 0; i < images.length; i++) 
      { 
       promises.push(loadImage(images[i])); 
      } 

      return Promise.all(promises); 
     } 

     return preLoad(); 
    }); 

    await page.screenshot({path: 'digg.png', fullPage: true}); 

    browser.close(); 
})(); 

उत्तर

14

कि के लिए एक built-in option है:

await page.goto('https://www.digg.com/', {"waitUntil" : "networkidle0"}); 

networkidle0 - नेविगेशन पर विचार अनुरूप तैयार किया जाए जब वहाँ कम से कम 500 एमएस

के लिए 0 से अधिक नेटवर्क कनेक्शन नहीं हैं

networkidle2 - कम से कम 500 एमएस के लिए 2 से अधिक नेटवर्क कनेक्शन होने पर नेविगेशन समाप्त होने पर विचार करें।

पीएस बेशक यह काम नहीं करेगा यदि आप अंतहीन-स्क्रॉलिंग-सिंगल-पेज-एप्लिकेशन जैसे ट्विटर के साथ काम कर रहे हैं।

+0

digg.com के मामले में कुछ छवियों को केवल तभी लोड किया जाता है जब आप स्क्रॉल करते हैं, क्या आप स्क्रॉलिंग के बाद छवियों को लोड करने की प्रतीक्षा करने के तरीके के बारे में जानते हैं? –

+1

मुझे लगता है कि आपका समाधान काम करेगा, लेकिन - digg के होम पेज कैसे काम करता है इसका अध्ययन करने के बाद - मैं कहूंगा कि आपको थोड़ा सा स्क्रॉल करना होगा, जबकि आपके कोड में आप लगभग एक पूर्ण पृष्ठ से कूदेंगे। स्रोत में देखें - बहुत आलसी लोडिंग छवियां हैं जो केवल व्यूपोर्ट में लोड होंगी। – Vaviloff

+0

मुझे लगता है कि यह होना चाहिए: {waitUntil: "networkidle"} की बजाय {"waitUntil": "networkidle"} – boblapointe

0

मैं ठीक उसी मुद्दे का सामना करना पड़ रहा हूँ:

यहाँ कोड मुझे मिल गया है अब तक, मैं उदाहरण के रूप में वेबसाइट https://www.digg.com का उपयोग कर रहा है। मैं एक समाधान लग रहा है का उपयोग कर शामिल होगी:

await page.setRequestInterceptionEnabled(true); 

page.on('request', interceptedRequest => { 
    //some code here that adds this request to ... 
    //a list and checks whether all list items have ... 
    //been successfully completed! 
}); 

https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagesetrequestinterceptionenabledvalue

+0

केवल वादे का उपयोग करके इसे हासिल करना संभव होना चाहिए। –

संबंधित मुद्दे