无界面浏览器 - Firefox, Chrome

Gao
# 概述 无界面浏览器 <`headdless mode`> 在进行自动化测试和服务器上运行时非常有用。 在服务器上,可能需要运行浏览器去执行一些特殊的任务,但是服务器上是没有 X Window 系统,这个时候就需要使用无界面浏览器了。 无界面浏览器可以去打开一些真正的页面,并且渲染,然后输出到 html,pdf 或图片。 无界面浏览器还可以打开调试端口,在没有图形界面的情况下,调试真正的浏览器页面。 ## Chrome Chrome 从版本 59 开始,提供了无界面浏览功能,使用方式如下: ```shell chrome \ --headless \ # Runs Chrome in headless mode. --disable-gpu \ # Temporarily needed for now. --remote-debugging-port=9222 \ https://www.chromestatus.com # URL to open. Defaults to about:blank. ``` - chrome 命令设置: ```shell alias chrome="/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome" alias chrome-canary="/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary" alias chromium="/Applications/Chromium.app/Contents/MacOS/Chromium" ``` Chrome headless mode 提供了很多强大功能: - 输出 DOM 结构 `--dump-dom` flag 会输出`document.body.innerHTML` ```shell chrome --headless --disable-gpu --dump-dom https://www.chromestatus.com/ ``` - 输出 PDF ```shell chrome --headless --disable-gpu --print-to-pdf https://www.chromestatus.com/ ``` - 输出截图 ```shell chrome --headless --disable-gpu --screenshot https://www.chromestatus.com/ # Size of a standard letterhead. chrome --headless --disable-gpu --screenshot --window-size=1280,1696 https://www.chromestatus.com/ # Nexus 5x chrome --headless --disable-gpu --screenshot --window-size=412,732 https://www.chromestatus.com/ ``` - REPL `--repl` 会打开一个 JS Console ```shell $ chrome --headless --disable-gpu --repl https://www.chromestatus.com/ [0608/112805.245285:INFO:headless_shell.cc(278)] Type a Javascript expression to evaluate or "quit" to exit. >>> location.href {"result":{"type":"string","value":"https://www.chromestatus.com/features"}} >>> quit $ ``` - 远程调试 `--remote-debugging-port=9222` 会打开调试端口,调试基于`DevTools protocol`协议可 以通过编辑器连接,来进行远程调试。 ### Node 编程接口 **The Puppeteer API** Puppeteer is a Node library developed by the Chrome team. It provides a high-level API to control headless (or full) Chrome. It's similar to other automated testing libraries like Phantom and NightmareJS, but it only works with the latest versions of Chrome. Among other things, Puppeteer can be used to easily take screenshots, create PDFs, navigate pages, and fetch information about those pages. I recommend the library if you want to quickly automate browser testing. It hides away the complexities of the DevTools protocol and takes care of redundant tasks like launching a debug instance of Chrome. Install it: ```shell yarn add puppeteer ``` Example - print the user agent ```js const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); console.log(await browser.version()); browser.close(); })(); ``` Example - taking a screenshot of the page ```js const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://www.chromestatus.com', {waitUntil: 'networkidle'}); await page.pdf({path: 'page.pdf', format: 'A4'}); browser.close(); })(); ``` Check out [Puppeteer's documentation](https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md) to learn more about the full API. ## Firefox Headless Firefox works on Fx55+ on Linux, and 56+ on Windows/Mac. 从 Firefox 57 开始,Firefox 开始支持截图 ``` /path/to/firefox -headless -screenshot https://developer.mozilla.com ``` - `-screenshot` name url — Set a custom name for the screenshot by including it between the -screenshot flag and the URL you want to capture. Note that you can specify other web-compatible image formats such as .jpg, .bmp, etc. - `--window-size=x` — Set a custom viewport width when taking the screenshot (full height is maintained). Note that the single argument version of this doesn't work. - `--window-size=x,y` — Set a custom viewport width and height to capture. Firefox headless 模式可以用于自动化测试,基于`Selenium`。 MDN 的[`headless-example`](https://github.com/mdn/headless-examples)