分类: Web开发
2017-07-04 23:47:11
在~/.bashrc 中加入
alias chrome="/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome" alias chrome-canary="/Applications/Google\ Chrome\ Canary.app/Contents/MacOS/Google\ Chrome\ Canary"
重新打开终端,我们就可以直接通过 chrome打开稳定版的Chrome,chrome-canary打开试验版的Chrome了。
参考官方说明, Headless模式需要Chrome Version >= 59
使用Chrome打开百度首页(带界面),能看到浏览器的打开
chrome
使用无界面模式启动Chrome打开百度首页(无界面),但不到浏览器界面打开,但任务栏会有图标
chrome --headless
使用无界面模式启动Chrome并将页面转为PDF,可以看到output.pdf的输出
chrome --headless --print-to-pdf
使用无界面模式启动Chrome并截图,可以看到screenshot.png的输出
chrome --headless --screenshot --window-size=414,736 /
使用无界面模式启动Chrome并打开交互环境
chrome --headless --repl
使用无界面模式启动Chrome,并开启调试Server
chrome --headless --remote-debugging-port=9222
参考
确保已经启动Headless Chrome,并启用了调试Server
chrome --headless --remote-debugging-port=9222
安装chrome-remote-interface
npm install chrome-remote-interface -g
查看命令说明,这里可以进行各种相关操作
$ chrome-remote-interface Usage: chrome-remote-interface [options] [command] Commands: inspect [options] [] inspect a target (defaults to the first available target) list list all the available targets/tabs new [ ] create a new target/tab activate activate a target/tab by id close close a target/tab by id version show the browser version protocol [options] show the currently available protocol descriptor Options: -h, --help output usage information -t, --host HTTP frontend host -p, --port HTTP frontend port -s, --secure HTTPS/WSS frontend
打开一个新页面
chrome-remote-interface new
查看刚打开的页面
chrome-remote-interface inspect
查看当前页面的URL
>>> Runtime.evaluate({expression:'location.href'})
可以通过系统调用的方式直接调用上面的命令行执行方式。这种方式在跨平台的情况下会有一些工作需要做。
Google出品的 这个网页质量检查工具,有一个组件专门做这事,考虑了各种平台的兼容性问题,源码参考,这个组件现在已经单独独立出来,作为一个单独的NPM组件chrome-launcher,可以直接使用这个在Node平台下调用,其他平台的也可以此为参考。
const chromeLauncher = require('chrome-launcher'); //启用无界面模式并开启远程调试,不同引用版本和方式,调用方式可能有些区别 //chromeLauncher.run({ chromeLauncher.launch({ // port: 9222, chromeFlags: [ '--headless' ]
}).then((chrome) => { // 拿到一个调试客户端实例 console.log(chrome)
chrome.kill();
});
实现了ChromeDevTools协议的工具库有很多,chrome-remote-interface是NodeJS的实现。
Chrome调试Server开启的是WebSocket交互的相关实现,要用编程的方式实现还需要封装一些WebSocket命令发送、结果接收等这一系列操作,这些chrome-remote-interface已经帮我们做了,更多实例可以参考。
const chromeLauncher = require('chrome-launcher'); const chromeRemoteInterface = require('chrome-remote-interface') //启用无界面模式并开启远程调试,不同引用版本和方式,调用方式可能有些区别 //chromeLauncher.run({ chromeLauncher.launch({
port: 9222,
chromeFlags: [ '--headless' ]
}).then((launcher) => {
chromeRemoteInterface.Version({
host:'localhost',
port:9222 }).then(versionInfo => { console.log(versionInfo)
});
chromeRemoteInterface({
host:'localhost',
port:9222 }).then((chrome) => { //这里调用ChromeDevToolsProtocol定义的接口 const {Network,Page} = chrome;
Network.requestWillBeSent((params) => { let {request} = params; let {url} = request; console.log(url)
});
Promise.all([
Network.enable(),
Page.enable()
]).then(() => {
Page.navigate({
url:'' })
});
setTimeout(() => {
launcher.kill()
},5000);
})
});