Headless Chromium allows running Chromium in a headless/server environment. Expected use cases include loading web pages, extracting metadata (e.g., the DOM) and generating bitmaps from page contents -- using all the modern web platform features provided by Chromium and Blink.
As of M118, precompiled headless_shell
binaries are available for download under the name chrome-headless-shell
via Chrome for Testing infrastructure.
There are two ways to use Headless Chromium:
--headless=old
command line flag:$ chrome --headless=old --remote-debugging-port=9222 https://chromium.org/
chrome://inspect/
in another instance of Chrome.For example, the chrome-remote-interface Node.js package can be used to extract a page's DOM like this:
const CDP = require('chrome-remote-interface'); (async () => { let client; try { // Connect to browser client = await CDP(); // Extract used DevTools domains. const {Page, Runtime} = client; // Enable events on domains we are interested in. await Page.enable(); await Page.navigate({url: 'https://example.com'}); await Page.loadEventFired(); // Evaluate outerHTML after page has loaded. const expression = {expression: 'document.body.outerHTML'}; const { result } = await Runtime.evaluate(expression); console.log(result.value); } catch (err) { console.error('Cannot connect to browser:', err); } finally { if (client) { await client.close(); } } })();
Alternatvely, the Puppeteer Node.js package can be used to communicate with headless, for example:
import puppeteer from 'puppeteer'; (async () => { const browser = await puppeteer.launch({headless: 'shell'}); const page = await browser.newPage(); await page.goto('https://example.com'); const title = await page.evaluate(() => document.title); console.log(title); await browser.close(); })();
Mailing list: headless-dev@chromium.org
Bug tracker: Internals>Headless
File a new bug (bit.ly/2pP6SBb)