命令行运行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. Servlet--HttpSessionBindingListener接口,HttpSessionBindingEvent类

    HttpSessionBindingListener 接口 定义 public interface HttpSessionBindingListener 这个对象被加入到 HTTP 的 session ...

  2. Asp.net core 2.0.1 Razor 的使用学习笔记(三)

    ASP.net core 2.0.0 中 asp.net identity 2.0.0 的基本使用(二)—用户账户及cookie配置 修改用户账户及cookie配置 一.修改密码强度和用户邮箱验证规则 ...

  3. alwaysOn中关于维护计划的应用方案

    由于alwaysOn环境下主副本所在的实际服务器不固定, 所以我目前采取的方案是创建维护计划的时候, 在各个服务器上创建一份维护计划. (假设有2个服务器需要故障转移, 那么就在这两个服务器上分别创建 ...

  4. JAVA中文件与Byte数组相互转换的方法

    JAVA中文件与Byte数组相互转换的方法,如下: public class FileUtil { //将文件转换成Byte数组 public static byte[] getBytesByFile ...

  5. java IO(一):File类

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

  6. 【转】高精度GPS测量中框架基准的统一

    一.地面基准点的坐标基准转换 一般情况下,我们可以从IERS或IGS等机构获取最新的站坐标和速度场,这些站坐标和速度场是在某一特定基准框架和历元下的坐标值,若要提供高精度GPS网的分析使用,还需要作框 ...

  7. R语言-单一变量分析

    R语言简介: R语言是一门专用于统计分析的语言,有大量的内置函数和第三方库来制作基于数据的表格 准备工作 安装R语言 https://cran.rstudio.com/bin/windows/base ...

  8. 浏览器通过file://访问文件和通过http://访问文件有什么区别

    1.file协议用于访问本地计算机中的文件,就如同在Windows资源管理器中打开文件一样,注意它是针对本地(本机)的,简单来说,file协议是访问你本机的文件资源.http访问本地HTML,是在本地 ...

  9. RMI基础

    远程方法调用(Remote Method Invocation,RMI)从JDK1.1就已经实现,它大大增强了Java开发分布式应用的能力.可以实现通过网络完成不同JVM间的通信,不仅可以传递基本的数 ...

  10. 引用MinGW生成的.dll.a后出现的问题

    以前很少调用MinGW的运行时库,现在用到一个项目,用到了glib和gettext等. 遇到了一个问题,折腾了一个下午. gettext的运行时库之一是intl,MinGW只提供了.dll.a,于是参 ...