命令行运行Headless Chrome

Chrome 安装(需要带梯子)

  • 下载地址
  • 几个版本的比较
    • Chromium 不是Chrome,但Chrome的内容基本来源于Chromium,这个是开源的版本,小时级别的更新
    • Canary 是试验版,翻译过来就是金丝雀,金丝雀对瓦斯等毒气很敏感,浓度稍高就会停止鸣叫甚至挂掉,金丝雀是瓦斯等毒气检测的土办法,这个场景在《寻龙诀》中黄渤的操作中也能看到。哈哈 扯远了,这个是daily build 版本。
    • Dev 是开发版,weekly build版本
    • Beta 是测试版,monthly build版本
    • Stable 是稳定版,不定期更新,一般也是一个月左右一次
    • 更新频率 Chromium > Chrome Canary > Chrome Dev > Chrome Beta > Chrome Stable
    • Chrome Dev、Chrome Beta 和 Chrome Stable三者只能同时出现一个
    • Chromium 、Chrome Canary 和 剩下的任意一个可共存
  • Windows平台下载下来的可能只是一个在线安装的程序,下载离线版在下载页面的URL里面加参数standalone=1

命令行快捷配置(Mac环境)

~/.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了。

命令行启动Chrome

  • 参考官方说明, Headless模式需要Chrome Version >= 59

  • 使用Chrome打开百度首页(带界面),能看到浏览器的打开

    chrome https://www.baidu.com
  • 使用无界面模式启动Chrome打开百度首页(无界面),但不到浏览器界面打开,但任务栏会有图标

    chrome --headless https://www.baidu.com
  • 使用无界面模式启动Chrome并将页面转为PDF,可以看到output.pdf的输出

    chrome --headless --print-to-pdf https://www.baidu.com
  • 使用无界面模式启动Chrome并截图,可以看到screenshot.png的输出

    chrome --headless --screenshot --window-size=414,736 https://www.baidu.com/
  • 使用无界面模式启动Chrome并打开交互环境

    chrome --headless --repl
  • 使用无界面模式启动Chrome,并开启调试Server

    chrome --headless --remote-debugging-port=9222
  • 参考 Chrome命令行参数列表

命令行操作Headless Chrome

  • 确保已经启动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] [<target>] inspect a target (defaults to the first available target)
    list list all the available targets/tabs
    new [<url>] create a new target/tab
    activate <id> activate a target/tab by id
    close <id> 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 <host> HTTP frontend host
    -p, --port <port> HTTP frontend port
    -s, --secure HTTPS/WSS frontend
  • 打开一个新页面

    chrome-remote-interface new https://www.baidu.com
  • 查看刚打开的页面

    chrome-remote-interface inspect
  • 查看当前页面的URL

    >>> Runtime.evaluate({expression:'location.href'})

可编程方式运行Headless Chrome

直接通过代码调用命令行启动Chrome 调试Server

可以通过系统调用的方式直接调用上面的命令行执行方式。这种方式在跨平台的情况下会有一些工作需要做。

Google出品的Lighthouse 这个网页质量检查工具,有一个组件专门做这事,考虑了各种平台的兼容性问题,源码参考lighthouse-chromelauncher,这个组件现在已经单独独立出来,作为一个单独的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已经帮我们做了,更多实例可以参考chrome-remote-interface的wiki

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:'https://www.baidu.com'
})
}); setTimeout(() => {
launcher.kill()
},5000); })
});

Web自动化之Headless Chrome开发工具库的更多相关文章

  1. Web自动化之Headless Chrome概览

    Web自动化 这里所说的Web自动化是所有跟页面相关的自动化,比如页面爬取,数据抓取,页面内容检测,页面功能测试,页面加载性能测试,页面回归测试等等,当前主要由如下几种解决方式: 文本数据获取 这就是 ...

  2. Web自动化之Headless Chrome编码实战

    API 概览 && 编码Tips 文档地址 github Chrome DevTools Protocol 协议本身的仓库 有问题可以在这里提issue github debugger ...

  3. Web自动化之Headless Chrome测试框架集成

    使用Selenium操作headless chrome 推荐 简介 WebDriver是一个W3C标准, 定义了一套检查和控制用户代理(比如浏览器)的远程控制接口,各大主流浏览器来实现这些接口以便调用 ...

  4. Chrome 开发工具指南

    Chrome 开发工具指南 谷歌 Chrome 开发工具,是基于谷歌浏览器内含的一套网页制作和调试工具.开发者工具允许网页开发者深入浏览器和网页应用程序的内部.该工具可以有效地追踪布局问题,设置 Ja ...

  5. Chrome 开发工具之Sources

    Sources面板主要用于查看web站点的资源列表及javascript代码的debug 熟悉面板 了解完面板之后,下面来试试这些功能都是如何使用的. 文件列表 展示当前页面内所引用资源的列表,和平常 ...

  6. Chrome 开发工具之 Memory

    开发过程中难免会遇到内存问题,emmm... 本文主要记录一下Chrome排查内存问题的面板,官网也有,但有些说明和例子跟不上新的版本了,也不够详细...   !!! 多图预警!!!    简单的内存 ...

  7. Chrome 开发工具之Timeline

    之前有说到Element,Console,Sources大多运用于debug,Network可用于debug和查看性能,今天的主角Timeline更多的是用在性能优化方面,它的作用就是记录与分析应用程 ...

  8. Chrome 开发工具之Console

    前段时间看git的相关,记的笔记也大致写到了博客上,还有些因为运用不熟,或者还有一些疑惑点,暂时也不做过多纠缠,之后在实践中多运用得出结论再整理分享吧. 工欲善其事,必先利其器.要想做好前端的工作,也 ...

  9. Chrome开发工具之Console

    Chrome开发工具-Console 看了别人的博客,才发现在百度主页用开发工具“Console”可以看到百度的招聘信息 前端调试工具可以按F12打开,谷歌的开发工具中的Console面板可以查看错误 ...

随机推荐

  1. Linux指令--rcp,scp

    rcp代表"remote file copy"(远程文件拷贝).该命令用于在计算机之间拷贝文件.rcp命令有两种格式.第一种格式用于文件到文件的拷贝:第二种格式用于把文件或目录拷贝 ...

  2. Servlet--取得初始化配置信息

    关于这块内容,主要就是玩一个接口:ServletConfig.先翻下API,了解一下. 定义: public interface ServletConfig 这个接口定义了一个对象,通过这个对象,Se ...

  3. 网络编程之TCP编程

    网络编程之TCP编程 前面已经介绍过关于TCP协议的东西,这里不做赘述.Java对于基于TCP协议的网络通信提供了良好的封装,Java使用socket对象来代表两端的通信窗口,并通过Socket产生I ...

  4. 自己用的一套reset.css,打算整理一下方便以后用,持续更新中,各位大神,不喜勿喷

    *{margin: 0; padding: 0;border:none;}img{vertical-align: top;width: 100%;border: none;}ul,li{list-st ...

  5. java面向对象基础(四):抽象类和接口

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  6. js中的语句

    java语句与js的语句一样.1.判断if else/switch <script type=text/javascript> function fun1(){ var num = 10; ...

  7. 10_set集合

    一.集合类型 集合是一组无序排列的可哈希的值(可哈希的值->不可变),集合成员可以做字典中的键.但集合本身是不可哈希的. 集合是无序没有索引,也没有像字典的key,所以集合不能更改元素.只能增删 ...

  8. jsp中实现点击文件名称完成下载

    1.文件名称添加点击事件 <a href="javascript:void(0);" id="wjm" onclick="wjxz();&quo ...

  9. NemaStudio船舶模拟软件下载及破解

    不啰嗦,上链接: https://files.cnblogs.com/files/lizhijian/NameStudio%E7%A0%B4%E8%A7%A3.zip 感谢阅读,希望可以帮到你.

  10. MySQL笔记-union

    union语法 select ... union [all | distinct] selct ... union用于把来自多个select语句的结果组合在一个结果集中. 两次查询的列表必须相同,否则 ...