2017-04-14 96 views
2

目前无头Chrome的问题是没有API来渲染整个页面,只有你在CLI参数中设置的“窗口”。无头Chrome渲染整页

我现在用的是chrome-remote-interface模块,这是捕获例如:

const fs = require('fs'); 
const CDP = require('chrome-remote-interface'); 

CDP({ port: 9222 }, client => { 

    // extract domains 
    const {Network, Page} = client; 

    Page.loadEventFired(() => { 
     const startTime = Date.now(); 
     setTimeout(() => { 
      Page.captureScreenshot() 
      .then(v => { 
       let filename = `screenshot-${Date.now()}`; 
       fs.writeFileSync(filename + '.png', v.data, 'base64'); 
       console.log(`Image saved as ${filename}.png`); 
       let imageEnd = Date.now(); 
       console.log('image success in: ' + (+imageEnd - +startTime) + "ms"); 
       client.close(); 
      }); 
     }, 5e3); 

    }); 
    // enable events then start! 
    Promise.all([ 
     // Network.enable(), 
     Page.enable() 
    ]).then(() => { 
     return Page.navigate({url: 'https://google.com'}); 
    }).catch((err) => { 
     console.error(`ERROR: ${err.message}`); 
     client.close(); 
    }); 
}).on('error', (err) => { 
    console.error('Cannot connect to remote endpoint:', err); 
}); 

为了呈现完整的网页,一个慢和黑客的解决办法是局部呈现。设置固定高度并滚动浏览页面,并在每X像素后截取屏幕截图。问题是如何驱动滚动部分?注入自定义JS还是可以通过Chrome远程接口实现?

回答

0

你见过这个吗?

https://medium.com/@dschnr/using-headless-chrome-as-an-automated-screenshot-tool-4b07dffba79a

此位声音的像它会帮助您解决问题:

// Wait for page load event to take screenshot 
    Page.loadEventFired(async() => { 
    // If the `full` CLI option was passed, we need to measure the height of 
    // the rendered page and use Emulation.setVisibleSize 
    if (fullPage) { 
     const {root: {nodeId: documentNodeId}} = await DOM.getDocument(); 
     const {nodeId: bodyNodeId} = await DOM.querySelector({ 
     selector: 'body', 
     nodeId: documentNodeId, 
     }); 
     const {model: {height}} = await DOM.getBoxModel({nodeId: bodyNodeId}); 

     await Emulation.setVisibleSize({width: viewportWidth, height: height}); 
     // This forceViewport call ensures that content outside the viewport is 
     // rendered, otherwise it shows up as grey. Possibly a bug? 
     await Emulation.forceViewport({x: 0, y: 0, scale: 1}); 
    } 

    setTimeout(async function() { 
     const screenshot = await Page.captureScreenshot({format}); 
     const buffer = new Buffer(screenshot.data, 'base64'); 
     file.writeFile('output.png', buffer, 'base64', function(err) { 
     if (err) { 
      console.error(err); 
     } else { 
      console.log('Screenshot saved'); 
     } 
     client.close(); 
     }); 
    }, delay); 
    }); 
+0

这是一个好的开始,但延迟加载的图像将显示其占位符 – Drakes