2017-09-11 6 views
5

私はPuppeteerを使用して、すべての画像がロードされても動作することができなくなった後にウェブサイトのスクリーンショットを撮ろうとします。ここで人形はすべての画像がロードされるのを待ってからスクリーンショットを撮る

は、私がこれまで持っているコードですが、私は例のウェブサイトとしてhttps://www.digg.comを使用しています:

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あり: 私が使用して関与するソリューションを感じている

networkidle0

await page.goto('https://www.digg.com/', {"waitUntil" : "networkidle0"}); 
- ナビゲーションを考えるが終了するときがあります少なくとも500ミリ秒間にネットワーク接続が0以下であること

networkidle2 - 少なくとも500ミリ秒間に2つ以上のネットワーク接続が存在しない場合、ナビゲーションを終了することを検討してください。

P.S.もちろん、あなたがTwitterのようなエンドレススクロールのシングルページアプリケーションを扱っているなら、それはうまくいかないでしょう。

+0

digg.comの場合、画像の一部がスクロールしたときにのみ読み込まれるため、スクロール後に画像が読み込まれるのを待つ方法がわかりますか? –

+1

あなたのソリューションはうまくいくと思いますが、diggのホームページの仕組みを勉強した後、少しずつスクロールしなければならないと言いますが、あなたのコードではほぼ完全なページにジャンプします。ソースを見てください - ビューポートにある場合にだけロードする遅延ロードイメージがたくさんあります。 – Vaviloff

+0

私はそれがすべきだと思う:{"waitUntil": "networkidle"}の代わりに{waitUntil: "networkidle"} – boblapointe

関連する問題