-
-
Save tongxunlu/4eecd666762cbbefe0ecdecae059a1be to your computer and use it in GitHub Desktop.
使用谷歌无头浏览器全屏截图Using headless Chrome as an automated screenshot tool
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| const CDP = require('chrome-remote-interface'); | |
| const argv = require('minimist')(process.argv.slice(2)); | |
| const file = require('fs'); | |
| // CLI Args | |
| const url = argv.url || 'https://www.google.com'; | |
| const format = argv.format === 'jpeg' ? 'jpeg' : 'png'; | |
| const viewportWidth = argv.viewportWidth || 1440; | |
| const viewportHeight = argv.viewportHeight || 900; | |
| const delay = argv.delay || 0; | |
| const userAgent = argv.userAgent; | |
| const fullPage = argv.full; | |
| // Start the Chrome Debugging Protocol | |
| CDP(async function(client) { | |
| // Extract used DevTools domains. | |
| const {DOM, Emulation, Network, Page, Runtime} = client; | |
| // Enable events on domains we are interested in. | |
| await Page.enable(); | |
| await DOM.enable(); | |
| await Network.enable(); | |
| // If user agent override was specified, pass to Network domain | |
| if (userAgent) { | |
| await Network.setUserAgentOverride({userAgent}); | |
| } | |
| // Set up viewport resolution, etc. | |
| const deviceMetrics = { | |
| width: viewportWidth, | |
| height: viewportHeight, | |
| deviceScaleFactor: 0, | |
| mobile: false, | |
| fitWindow: false, | |
| }; | |
| await Emulation.setDeviceMetricsOverride(deviceMetrics); | |
| await Emulation.setVisibleSize({width: viewportWidth, height: viewportHeight}); | |
| // Navigate to target page | |
| await Page.navigate({url}); | |
| // 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); | |
| }); | |
| }).on('error', err => { | |
| console.error('Cannot connect to browser:', err); | |
| }); |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
https://medium.com/@dschnr/using-headless-chrome-as-an-automated-screenshot-tool-4b07dffba79a 主要
https://cn.bing.com/search?q=const%20%7BDOM%2C%20Emulation%2C%20Network%2C%20Page%2C%20Runtime&qs=n&form=QBRE&sp=-1&pq=const%20%7Bdom%2C%20emulation%2C%20network%2C%20page%2C%20runtime&sc=0-45&sk=&cvid=0AEE445F8EAC4728BA1B67755997A0A6
关键字