2017-09-11 48 views
5

我正在使用Puppeteer试图在加载所有图像但不能让它工作后截取网站。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

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

networkidle0 - 考虑导航的结束是有不超过0个网络连接至少500毫秒

networkidle2 - 当网络连接数不超过2个毫秒时,请考虑导航完成。

P.S.当然,如果你正在使用像Twitter这样的无限滚动单页应用程序,它将无法工作。

+0

在digg.com的情况下,只有当您向下滚动时才加载某些图像,您是否知道在滚动后等待图像加载的方法? –

+1

我猜你的解决方案会起作用,但是 - 在研究digg的主页如何工作之后 - 我会说你必须一点一点地滚动,而在你的代码中,你几乎要跳完一整页。查看源代码 - 有很多延迟加载的图像,只有在视口中才会加载。 – Vaviloff

+0

我认为它应该是:{waitUntil:“networkidle”}而不是{“waitUntil”:“networkidle”} – boblapointe

相关问题