标签 Chrome 下的文章

作为全球头号浏览器,谷歌浏览器不断发展,谷歌一直在寻求提高所有平台的可用性,安全性和性能的方法。最近,谷歌开始研究一项新功能,该功能将阻止网站接管 Chromium 中的后退按钮。

由于许多用户发现许多网站或者网页使得浏览器中的后退按钮几乎没用,因为它们不想让用户离开当前页面,在这种情况下,按下后退按钮没有任何效果,因为浏览器似乎卡在同一页面上。这是一种噱头,利用后退按钮在浏览器中的工作方式,并使用重定向或历史操作。

谷歌表示,有些页面使用户很难或不可能通过浏览器后退按钮返回他们原先的页面。这是通过重定向或操纵浏览器历史记录来实现的,并导致滥用和恼人的用户体验。谷歌将通过阻止任何不涉及用户输入的行为来解决这个问题,这意味着按下后退按钮将获得预期的结果,并且不允许复杂的代码进行干预。浏览器后退按钮的新行为将跳过添加历史记录条目或重定向用户页面,但是同时不会影响 history.back/forward API。

该功能仍在开发中,可在所有平台上使用,包括 Windows,Mac,Linux,Chrome OS,Android 和 iOS。

来源:cnBeta.COM

更多资讯

法院驳回针对苹果 FaceTime 窃听漏洞发起的诉讼

据外媒报道,早在今年 1 月,FaceTime 就出现了一个重大漏洞,它能让用户在 FaceTime 电话未被接受的情况下也能强行与另一个人建立 FaceTime 连接,即使在 FaceTime 调用未被接受的情况下,同时还可以访问其音频和视频。

来源: cnBeta.COM

详情: http://t.cn/EosuMLj

报道称美国军方不知道其运营网站的具体数量

据外媒 The Verge 报道,美国国防部不确定其运营了多少个网站。据美国军事专刊 《星条旗报》 Starsand Stripes 报道,在上个月的一次活动中,马里兰州米德堡国防媒体活动代理主任、美国陆军上校 Paul Haverstick 表示,对五角大楼运营的网站数量“并不确定”。

来源: cnBeta.COM

详情: http://t.cn/EosuSvy

网络公司后台被攻击损失近千万元 民警千里抓“黑客”

去年 12 月,北京回龙观派出所接到辖区内一网络公司报警,称其开发的软件被黑客攻击,公司服务器全面瘫痪。警方经过近半年的侦查,通过层层数据梳理成功锁定嫌疑人,近日远赴成都将雇佣黑客实施网络攻击的两名嫌疑人抓获归案。目前案件正在进一步工作中。

来源: 北京晚报

详情: http://t.cn/EosupM6

土耳其对脸书数据泄露事件罚款 27 万美元

土耳其官方部门“个人数据保护机构”10 日说,就社交媒体脸书去年泄露用户数据影响土耳其用户事件,该机构于今年 4 月对脸书罚款 165 万土耳其里拉(约合 27 万美元)。

来源: 新华网

详情: http://t.cn/EosuYpu

(信息来源于网络,安华金和搜集整理)

据外媒 Neowin 报道,网络钓鱼并不是一个关于网络安全的新话题,尽管经常会发现新的和创造性的方法来实施这种做法。其中一种方式是新发现并巧妙地被命名为“盗梦空间栏”的网络钓鱼方法。

由开发人员 James Fisher 提供,这个相当简单的技巧已在 Chrome 移动版中得到证明,并利用了浏览器在地址栏方面的行为。当用户向下滚动时,为了给网页留出更多空间,Chrome 会隐藏地址栏,而这正是这个所谓的“盗梦空间栏”的用武之地。

如上所述,概念证明使用汇丰网站作为用户所在的真实网站的替代品。这是通过 Fisher 称之为“滚动监狱”的东西来完成的,其中页面的整个内容被困在一个带有 overflow:scroll 的新元素中,从而在浏览器中创建一种浏览器 —— 对 2010 年的《盗梦空间》的“梦中梦”的概念的引用。虚假地址栏甚至可以进行交互。

为了创造一个更精细的错觉,开发人员表示,具有恶意意图的人可能会在“滚动监狱”的顶部添加“非常高的填充元素”。这样做是为了防止 Chrome 在用户向上滚动时重新显示地址栏的正常行为。实际上,这看起来像页面刷新。

虽然通过简单地导航到 Chrome 的一个菜单就可以打破错觉,但这仍然被认为是一种令人不安的实施网络钓鱼攻击的方式。

来源:cnBeta.COM

更多资讯

涉案金额 2.3 亿 春节档电影侵权盗版系列专案侦破

公安部今天在江苏扬州召开新闻发布会,通报公安部部署开展打击春节档电影侵权盗版违法犯罪活动、成功办“2·15”系列专案工作情况。今年春节期间《流浪地球》《飞驰人生》《疯狂的外星人》等几部热播电影上映后,出现了大规模盗版,不仅严重侵害了影视作品制作方、出品人的合法权益,而且严重影响了我国影视行业提质升级发展。

来源: 央视财经

详情: http://t.cn/ESI1T1M

法国新区块链法规定银行不能随意拒绝为虚拟货币初创公司提供服务

据外媒报道,在发达国家中,法国对加密货币和区块链公司监管的新做法可以说是前卫的。或许最引人注目的例子就是,法国金融市场监管机构(AMF)起草的监管框架,其目的是消除此类初创企业长期以来面临的一个争议点:银行关系。

来源: cnBeta.COM
详情: http://t.cn/ESI1u95

iPod 之父:苹果屏幕时间功能存在很多漏洞和不足

4 月 29 日消息,据国外媒体报道,苹果近日在屏幕时间应用方面陷入了麻烦之中,其被外媒报道对大量的第三方这一类应用进行了限制,部分还被其从 App Store 中移除,部分开发商认为苹果此举是为了打压竞争对手,以扶持自家的屏幕时间控制功能,两款应用的开发商还因此而将苹果投诉至欧盟的竞争办公室。

来源: TechWeb

详情: http://t.cn/ESI1Dkh

GoDaddy 宣布移除 1.5 万个涉嫌销售假冒产品的欺诈子域名

网络托管服务提供商和域名注册商 GoDaddy 宣布已删除下架超过 15000 个子域名。这些子域名被黑客用于发送垃圾邮件,向消费者出售假冒伪劣产品。用户通常会收到各种宣传产品的垃圾邮件,如果受害者点击这些电子邮件中的链接,就会跳转访问托管在合法网站下的子域名,在该网站合法所有者不知情的情况下牟取利益。

来源: cnBeta.COM

详情: http://t.cn/ESIBZxB

(信息来源于网络,安华金和搜集整理)

Big News

微软释放出其基于 Chromium 的 Edge 浏览器:微软为了改进浏览器的兼容性以及减少前端领域的碎片化,主动发起改革,将 Edge 浏览器的内核由自家的 EdgeHTML 变为 Chromium 提供的 WebKit 内核。

对于前端来说,还真的是一个大的利好消息,当 Edge 也开始使用 Chromium 内核以后,前端开发者以后只需要兼容两种渲染引擎了,分别是 Firefox 使用的 Gecko 和 Chromium 使用的 Webkit。这当然算是一件好事情。 不过,反过来想一想,如果渲染引擎一家独大的话,那未来, HTML 标准的定制是否也需要看浏览器内核厂商的脸色呢?

信息来源:【MicrosoftEdgeInsider】

Quick News

  • 共享单车迎来涨价潮:近日,北京地区的共享单车开始实行新的收费价格表。摩拜单车新版骑行15分钟以内收费1元,超出部分每15分钟收费0.5元,骑行一小时费用为2.5元。小蓝单车则是起步价由每30分钟1元更改为每15分钟1元,超出时长后每15分钟0.5元,骑行1小时同样为2.5元。【虎嗅】
  • Windows Embedded POSReady 2009 停止服务: Windows Embedded POSReady 2009 是微软基于 Windows XP SP3 定制的为服务点(POS)设计的嵌入式操作系统,广泛适用于收银机、服务亭、电子标牌、ATM机、加油机等设备。【快科技】
  • 虚拟货币“挖矿”活动被列为淘汰产业:近日国家发改委发布的关于就《产业结构调整指导目录(2019年本,征求意见稿)》中将虚拟货币“挖矿”活动列入淘汰类产业之中。【每日经济新闻】

你或许已经注意到了,在 Linux 上使用 Google Chrome 或 Chromium 浏览器在 YouTube 或其它类似网站观看高清视频会增加你的 CPU 使用率,如果你用的是笔记本,电脑会发热而且电池会很快用完。这是因为 Chrome/Chromium(Firefox 也是如此,但是 Firefox 的问题没有办法解决)在 Linux 上不支持硬件加速的视频解码。

这篇文章讲述了如何在 Linux 环境安装带有 VA-API 补丁的 Chromium 开发版,它支持 GPU 加速的视频解码,可以显著减少观看在线高清视频时的 CPU 使用率,这篇教程只适用于 Intel 和 Nvidia 的显卡,我没有 ATI/AMD 的显卡可以试验,也没有使用过这几种显卡。

这是 Chromium 浏览器在 Ubuntu18.04 中,在没有 GPU 加速视频解码的情况下播放一个 1080p 的 YouTube 视频:

这是带有 VA-API 补丁的 Chromium 浏览器在 Ubuntu18.04 中,在带有 GPU 加速视频解码的情况下播放同样的 1080p 的 YouTube 视频:

注意截图中的 CPU 使用率。两张截图都是在我老旧而依然强大的桌面计算机上捕捉的。在我的笔记本电脑上,没有硬件加速的 Chromium 带来更高的 CPU 使用率。

“只需 VA-API 即可在 Linux 启用 VAVDA、VAVEA 和 VAJDA” 这个补丁在一年多以前就提交给了 Chromium,但是它还没有合并。

Chrome 有一个选项可以覆盖软件渲染列表(#ignore-gpu-blacklist),但是这个选项不能启用硬件加速的视频解码。启用这个选项以后,你或许会在访问 chrome://gpu 时发现这些信息:“Video Decode: Hardware accelerated “,然而这个并不意味着真的可以工作。在 YouTube 打开一个高清视频并用诸如 htop 的工具查看 CPU 使用率(这是我在以上截图中用来查看 CPU 使用率的)。因为 GPU 视频解码没有真的被启用,你应该看到较高的 CPU 使用率。下面有一个部分是关于检查你是否真的在使用硬件加速的视频解码的。

文中使用的 Chromium 浏览器 Ubuntu 版启用 VA-API 的补丁在这个地址可以获得

在 Ubuntu 和 Linux Mint 安装和使用带有 VA-API 支持的 Chromium 浏览器

每个人都该知道 Chromium 开发版本没有理想中那么稳定。所以你可能发现 bug,它可能会发生崩溃等情况。它现在可能正常运行,但是谁知道几次更新以后会发生什么。

还有,如果你想启用 Widevine 支持(这样你才能观看 Netflix 视频和 YouTube 付费视频),Chromium dev 分支 PPA 要求你执行一些额外步骤。 如果你想要一些功能,比如同步,也是如此(需要注册 API 密钥还要在你的系统上设置好)。执行这些任务的说明在 Chromium 开发版本的 PPA 中有详细解释。

对于 Nvidia 显卡,vdpau 视频驱动程序需要更新以便显示 vaQuerySurfaceAttributes。所以 Nvidia 需要使用打过补丁的 vdpau-va-driver。值得庆幸的是,Chromium-dev PPA 提供了这个打过补丁的包。

带有 VA-API 补丁的 Chromium 也可用于其它 Linux 发行版,在第三方仓库,比如说 Arch Linux(对于 Nvidia 你需要这个补丁过的 libva-vdpau-driver)。如果你不使用 Ubuntu 或 Linux Mint,你得自己找那些包。

1、安装带有 VA-API 补丁的 Chromium

有一个带 VA-API 补丁的 Chromium Beta PPA,但是它缺少适用于 Ubuntu 18.04 的 vdpau-video。如果你需要,你可以使用这个 Beta PPA,而不是我在下面的步骤中使用 Dev PPA,不过如果你使用 Nvidia 显卡,你需要从这个 Dev PPA 中下载安装 vdpau-va-driver,并确认 Ubuntu/Linux Mint 不更新这个包(有点复杂,如果你准备根据下面步骤使用 Dev PPA 的话,不需要手动做这些)。

你可以添加 Chromium 开发分支 PPA,并在 Ubuntu 或 Linux Mint(及其它基于 Ubuntu 的发行版,如 elementary,以及 Ubuntu 或 Linux Mint 的风味版,如 Xubuntu、Kubuntu、Ubuntu MATE、Linux Mint MATE 等等)上安装最新的 Chromium 浏览器开发版:

sudo add-apt-repository ppa:saiarcot895/chromium-dev
sudo apt-get update
sudo apt install chromium-browser

2、安装 VA-API 驱动

对于 Intel 的显卡,你需要安装 i965-va-driver 这个包(它可能早就安装好了)

sudo apt install i965-va-driver

对于 Nvidia 的显卡(在开源的 Nouveau 驱动和闭源的 Nvidia 驱动上,它应该都有效), 安装 vdpau-va-driver

sudo apt install vdpau-va-driver

3、在 Chromium 启用硬件加速视频选项

复制这串地址,粘贴进 Chromium 的 URL 栏: chrome://flags/#enable-accelerated-video (或者在 chrome://flags 搜索 Hardware-accelerated video )并启用它,然后重启 Chromium 浏览器。

在默认的 Google Chrome / Chromium 版本,这个选项不可用,但是你可以在启用了 VP-API 的 Chromium 版本启用它。

4、安装 h264ify Chrome 扩展

YouTube(可能还有其它一些网址也是如此)默认使用 VP8 或 VP9 编码解码器,许多 GPU 不支持这种编码解码器的硬件解码。h264ify 会强制 YouTube 使用大多数 GPU 都支持的 H.264 而不是 VP8/VP9。

这个扩展还能阻塞 60fps 的视频,对低性能机器有用。

你可以在视频上右键点击,并且选择 Stats for nerds 以查看 Youtube 视频所使用额编码解码器,如果启用了 h264ify 扩展,你可以看到编码解码器是 avc / mp4a。如果没有启用,编码解码器应该是 vp09 / opus。

如何检查 Chromium 是否在使用 GPU 视频解码

在 YouTube 打开一个视频,然后,在 Chromium 打开一个新的标签页并将以下地址输入 URL 栏:chrome://media-internals

chrome://media-internals 标签页中,点击视频的 URL(为了展开它), 往下滚动查看 Player Properties 的下面,你应该可以找到 video_decoder 属性。如果video_decoder 的值是 GpuVideoDecoder ,这说明当前在另一个标签页播放的 YouTube 视频正在使用硬件加速的的视频解码。

如果它显示的是 FFmpegVideoDecoderVpxVideoDecoder ,说明加速视频解码无效或者你忘记安装或禁用了 h264ify 这个 Chrome 扩展。

如果无效,你可以通过在命令行运行 chromium-browser ,通过查看是否有 VA-API 相关的错误显示出来以调试。你也可以运行 vainfo(在 Ubuntu 或 Linux Mint 上安装:sudo apt install vainfo)和 vdpauinfo (对于 Nvidia,在 Ubuntu 或 Linux Mint 上安装:sudo apt install vdpauinfo)并且查看是否有显示任何错误。


via: https://www.linuxuprising.com/2018/08/how-to-enable-hardware-accelerated.html

作者:Logix 选题:lujun9972 译者:GraveAccent 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果你想使用 Headless Chrome 进行自动化测试,那么就往下!这篇文章将让你完全使用 Karma 作为 运行器 runner ,并且使用 Mocha+Chai 来编撰测试。

这些东西是什么?

Karma、Mocha、Chai、Headless Chrome,哦,我的天哪!

Karma 是一个测试工具,可以和所有最流行的测试框架(JasmineMochaQUnit)配合使用。

Chai 是一个断言库,可以与 Node 和浏览器一起使用。这里我们需要后者。

Headless Chrome 是一种在没有浏览器用户界面的无需显示环境中运行 Chrome 浏览器的方法。使用 Headless Chrome(而不是直接在 Node 中测试) 的一个好处是 JavaScript 测试将在与你的网站用户相同的环境中执行。Headless Chrome 为你提供了真正的浏览器环境,却没有运行完整版本的 Chrome 一样的内存开销。

设置

安装

使用 yarn 安装 Karma、相关插件和测试用例:

yarn add --dev karma karma-chrome-launcher karma-mocha karma-chai
yarn add --dev mocha chai

或者使用 npm

npm i --save-dev karma karma-chrome-launcher karma-mocha karma-chai
npm i --save-dev mocha chai

在这篇文章中我使用 MochaChai,但是你也可以选择自己最喜欢的在浏览器中工作的断言库。

配置 Karma

创建一个使用 ChromeHeadless 启动器的 karma.config.js 文件。

karma.conf.js

module.exports = function(config) {
  config.set({
    frameworks: ['mocha', 'chai'],
    files: ['test/**/*.js'],
    reporters: ['progress'],
    port: 9876,  // karma web server port
    colors: true,
    logLevel: config.LOG_INFO,
    browsers: ['ChromeHeadless'],
    autoWatch: false,
    // singleRun: false, // Karma captures browsers, runs the tests and exits
    concurrency: Infinity
  })
}
注意: 运行 ./node_modules/karma/bin/karma init karma.conf.js 生成 Karma 的配置文件。

写一个测试

/test/test.js 中写一个测试:

/test/test.js

describe('Array', () => {
  describe('#indexOf()', () => {
    it('should return -1 when the value is not present', () => {
      assert.equal(-1, [1,2,3].indexOf(4));
    });
  });
});

运行你的测试

在我们设置好用于运行 Karma 的 package.json 中添加一个测试脚本。

package.json

"scripts": {
  "test": "karma start --single-run --browsers ChromeHeadless karma.conf.js"
}

当你运行你的测试(yarn test)时,Headless Chrome 会启动并将运行结果输出到终端:

创建你自己的 Headless Chrome 启动器

ChromeHeadless 启动器非常棒,因为它可以在 Headless Chrome 上进行测试。它包含了适合你的 Chrome 标志,并在端口 9222 上启动 Chrome 的远程调试版本。

但是,有时你可能希望将自定义的标志传递给 Chrome 或更改启动器使用的远程调试端口。要做到这一点,可以通过创建一个 customLaunchers 字段来扩展基础的 ChromeHeadless 启动器:

karma.conf.js

module.exports = function(config) {
  ...

  config.set({
    browsers: ['Chrome', 'ChromeHeadless', 'MyHeadlessChrome'],

    customLaunchers: {
      MyHeadlessChrome: {
        base: 'ChromeHeadless',
        flags: ['--disable-translate', '--disable-extensions', '--remote-debugging-port=9223']
      }
    },
  }
};

完全在 Travis CI 上运行它

在 Headless Chrome 中配置 Karma 运行测试是很困难的。而在 Travis 中持续集成就只有几种!

要在 Travis 中运行测试,请使用 dist: trusty 并安装稳定版 Chrome 插件:

.travis.yml

language: node_js
node_js:
  - "7"
dist: trusty # needs Ubuntu Trusty
sudo: false  # no need for virtualization.
addons:
  chrome: stable # have Travis install chrome stable.
cache:
  yarn: true
  directories:
    - node_modules
install:
  - yarn
script:
  - yarn test

作者简介

Eric Bidelman 谷歌工程师,Lighthouse 开发,Web 和 Web 组件开发,Chrome 开发


via: https://developers.google.com/web/updates/2017/06/headless-karma-mocha-chai

作者:Eric Bidelman 译者:firmianay 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

摘要

在 Chrome 59 中开始搭载 Headless Chrome。这是一种在 无需显示 headless 的环境下运行 Chrome 浏览器的方式。从本质上来说,就是不用 chrome 浏览器来运行 Chrome 的功能!它将 Chromium 和 Blink 渲染引擎提供的所有现代 Web 平台的功能都带入了命令行。

它有什么用?

无需显示 headless 的浏览器对于自动化测试和不需要可视化 UI 界面的服务器环境是一个很好的工具。例如,你可能需要对真实的网页运行一些测试,创建一个 PDF,或者只是检查浏览器如何呈现 URL。

注意: Mac 和 Linux 上的 Chrome 59 都可以运行无需显示模式。对 Windows 的支持将在 Chrome 60 中提供。要检查你使用的 Chrome 版本,请在浏览器中打开 chrome://version

开启 无需显示 headless 模式(命令行界面)

开启 无需显示 headless 模式最简单的方法是从命令行打开 Chrome 二进制文件。如果你已经安装了 Chrome 59 以上的版本,请使用 --headless 标志启动 Chrome:

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.
注意:目前你仍然需要使用 --disable-gpu 标志。但它最终会不需要的。

chrome 二进制文件应该指向你安装 Chrome 的位置。确切的位置会因平台差异而不同。当前我在 Mac 上操作,所以我为安装的每个版本的 Chrome 都创建了方便使用的别名。

如果您使用 Chrome 的稳定版,并且无法获得测试版,我建议您使用 chrome-canary 版本:

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 Cannary。

命令行的功能

在某些情况下,你可能不需要以脚本编程的方式操作 Headless Chrome。可以使用一些有用的命令行标志来执行常见的任务。

打印 DOM

--dump-dom 标志将打印 document.body.innerHTML 到标准输出:

chrome --headless --disable-gpu --dump-dom https://www.chromestatus.com/

创建一个 PDF

--print-to-pdf 标志将页面转出为 PDF 文件:

chrome --headless --disable-gpu --print-to-pdf https://www.chromestatus.com/

截图

要捕获页面的屏幕截图,请使用 --screenshot 标志:

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/

使用 --screenshot 标志运行 Headless Chrome 将在当前工作目录中生成一个名为 screenshot.png 的文件。如果你正在寻求整个页面的截图,那么会涉及到很多事情。来自 David Schnurr 的一篇很棒的博文已经介绍了这一内容。请查看 使用 headless Chrome 作为自动截屏工具

REPL 模式 (read-eval-print loop)

--repl 标志可以使 Headless Chrome 运行在一个你可以使用浏览器评估 JS 表达式的模式下。执行下面的命令:

$ 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

在没有浏览器界面的情况下调试 Chrome

当你使用 --remote-debugging-port=9222 运行 Chrome 时,它会启动一个支持 DevTools 协议的实例。该协议用于与 Chrome 进行通信,并且驱动 Headless Chrome 浏览器实例。它也是一个类似 Sublime、VS Code 和 Node 的工具,可用于应用程序的远程调试。#协同效应

由于你没有浏览器用户界面可用来查看网页,请在另一个浏览器中输入 http://localhost:9222,以检查一切是否正常。你将会看到一个 可检查的 inspectable 页面的列表,可以点击它们来查看 Headless Chrome 正在呈现的内容:

DevTools 远程调试界面

从这里,你就可以像往常一样使用熟悉的 DevTools 来检查、调试和调整页面了。如果你以编程方式使用 Headless Chrome,这个页面也是一个功能强大的调试工具,用于查看所有通过网络与浏览器交互的原始 DevTools 协议命令。

使用编程模式 (Node)

Puppeteer 库 API

Puppeteer 是一个由 Chrome 团队开发的 Node 库。它提供了一个高层次的 API 来控制无需显示版(或 完全版)的 Chrome。它与其他自动化测试库,如 Phantom 和 NightmareJS 相类似,但是只适用于最新版本的 Chrome。

除此之外,Puppeteer 还可用于轻松截取屏幕截图,创建 PDF,页面间导航以及获取有关这些页面的信息。如果你想快速地自动化进行浏览器测试,我建议使用该库。它隐藏了 DevTools 协议的复杂性,并可以处理诸如启动 Chrome 调试实例等繁冗的任务。

安装:

yarn add puppeteer

例子 - 打印用户代理:

const puppeteer = require('puppeteer');

(async() => {
  const browser = await puppeteer.launch();
  console.log(await browser.version());
  browser.close();
})();

例子 - 获取页面的屏幕截图:

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();
})();

查看 Puppeteer 的文档,了解完整 API 的更多信息。

CRI 库

chrome-remote-interface 是一个比 Puppeteer API 更低层次的库。如果你想要更接近原始信息和更直接地使用 DevTools 协议的话,我推荐使用它。

启动 Chrome

chrome-remote-interface 不会为你启动 Chrome,所以你要自己启动它。

在前面的 CLI 章节中,我们使用 --headless --remote-debugging-port=9222 手动启动了 Chrome。但是,要想做到完全自动化测试,你可能希望从你的应用程序中启动 Chrome。

其中一种方法是使用 child_process

const execFile = require('child_process').execFile;

function launchHeadlessChrome(url, callback) {
  // Assuming MacOSx.
  const CHROME = '/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome';
  execFile(CHROME, ['--headless', '--disable-gpu', '--remote-debugging-port=9222', url], callback);
}

launchHeadlessChrome('https://www.chromestatus.com', (err, stdout, stderr) => {
  ...
});

但是如果你想要在多个平台上运行可移植的解决方案,事情会变得很棘手。请注意 Chrome 的硬编码路径:

使用 ChromeLauncher

Lighthouse 是一个令人称奇的网络应用的质量测试工具。Lighthouse 内部开发了一个强大的用于启动 Chrome 的模块,现在已经被提取出来单独使用。chrome-launcher NPM 模块 可以找到 Chrome 的安装位置,设置调试实例,启动浏览器和在程序运行完之后将其杀死。它最好的一点是可以跨平台工作,感谢 Node!

默认情况下,chrome-launcher 会尝试启动 Chrome Canary(如果已经安装),但是你也可以更改它,手动选择使用的 Chrome 版本。要想使用它,首先从 npm 安装:

yarn add chrome-launcher

例子 - 使用 chrome-launcher 启动 Headless Chrome:

const chromeLauncher = require('chrome-launcher');

// Optional: set logging level of launcher to see its output.
// Install it using: yarn add lighthouse-logger
// const log = require('lighthouse-logger');
// log.setLevel('info');

/**
 * Launches a debugging instance of Chrome.
 * @param {boolean=} headless True (default) launches Chrome in headless mode.
 *     False launches a full version of Chrome.
 * @return {Promise<ChromeLauncher>}
 */
function launchChrome(headless=true) {
  return chromeLauncher.launch({
    // port: 9222, // Uncomment to force a specific port of your choice.
    chromeFlags: [
      '--window-size=412,732',
      '--disable-gpu',
      headless ? '--headless' : ''
    ]
  });
}

launchChrome().then(chrome => {
  console.log(`Chrome debuggable on port: ${chrome.port}`);
  ...
  // chrome.kill();
});

运行这个脚本没有做太多的事情,但你应该能在任务管理器中看到启动了一个 Chrome 的实例,它加载了页面 about:blank。记住,它不会有任何的浏览器界面,我们是无需显示的。

为了控制浏览器,我们需要 DevTools 协议!

检索有关页面的信息

警告: DevTools 协议可以做一些有趣的事情,但是起初可能有点令人生畏。我建议先花点时间浏览 DevTools 协议查看器。然后,转到 chrome-remote-interface 的 API 文档,看看它是如何包装原始协议的。

我们来安装该库:

yarn add chrome-remote-interface

例子 - 打印用户代理:

const CDP = require('chrome-remote-interface');

...

launchChrome().then(async chrome => {
  const version = await CDP.Version({port: chrome.port});
  console.log(version['User-Agent']);
});

结果是类似这样的东西:HeadlessChrome/60.0.3082.0

例子 - 检查网站是否有 Web 应用程序清单

const CDP = require('chrome-remote-interface');

...

(async function() {

const chrome = await launchChrome();
const protocol = await CDP({port: chrome.port});

// Extract the DevTools protocol domains we need and enable them.
// See API docs: https://chromedevtools.github.io/devtools-protocol/
const {Page} = protocol;
await Page.enable();

Page.navigate({url: 'https://www.chromestatus.com/'});

// Wait for window.onload before doing stuff.
Page.loadEventFired(async () => {
  const manifest = await Page.getAppManifest();

  if (manifest.url) {
    console.log('Manifest: ' + manifest.url);
    console.log(manifest.data);
  } else {
    console.log('Site has no app manifest');
  }

  protocol.close();
  chrome.kill(); // Kill Chrome.
});

})();

例子 - 使用 DOM API 提取页面的 <title>

const CDP = require('chrome-remote-interface');

...

(async function() {

const chrome = await launchChrome();
const protocol = await CDP({port: chrome.port});

// Extract the DevTools protocol domains we need and enable them.
// See API docs: https://chromedevtools.github.io/devtools-protocol/
const {Page, Runtime} = protocol;
await Promise.all([Page.enable(), Runtime.enable()]);

Page.navigate({url: 'https://www.chromestatus.com/'});

// Wait for window.onload before doing stuff.
Page.loadEventFired(async () => {
  const js = "document.querySelector('title').textContent";
  // Evaluate the JS expression in the page.
  const result = await Runtime.evaluate({expression: js});

  console.log('Title of page: ' + result.result.value);

  protocol.close();
  chrome.kill(); // Kill Chrome.
});

})();

使用 Selenium、WebDriver 和 ChromeDriver

现在,Selenium 开启了 Chrome 的完整实例。换句话说,这是一个自动化的解决方案,但不是完全无需显示的。但是,Selenium 只需要进行小小的配置即可运行 Headless Chrome。如果你想要关于如何自己设置的完整说明,我建议你阅读“使用 Headless Chrome 来运行 Selenium”,不过你可以从下面的一些示例开始。

使用 ChromeDriver

ChromeDriver 2.3.0 支持 Chrome 59 及更新版本,可与 Headless Chrome 配合使用。在某些情况下,你可能需要等到 Chrome 60 以解决 bug。例如,Chrome 59 中屏幕截图已知存在问题。

安装:

yarn add selenium-webdriver chromedriver

例子:

const fs = require('fs');
const webdriver = require('selenium-webdriver');
const chromedriver = require('chromedriver');

// This should be the path to your Canary installation.
// I'm assuming Mac for the example.
const PATH_TO_CANARY = '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary';

const chromeCapabilities = webdriver.Capabilities.chrome();
chromeCapabilities.set('chromeOptions', {
  binary: PATH_TO_CANARY // Screenshots require Chrome 60\. Force Canary.
  'args': [
    '--headless',
  ]
});

const driver = new webdriver.Builder()
  .forBrowser('chrome')
  .withCapabilities(chromeCapabilities)
  .build();

// Navigate to google.com, enter a search.
driver.get('https://www.google.com/');
driver.findElement({name: 'q'}).sendKeys('webdriver');
driver.findElement({name: 'btnG'}).click();
driver.wait(webdriver.until.titleIs('webdriver - Google Search'), 1000);

// Take screenshot of results page. Save to disk.
driver.takeScreenshot().then(base64png => {
  fs.writeFileSync('screenshot.png', new Buffer(base64png, 'base64'));
});

driver.quit();

使用 WebDriverIO

WebDriverIO 是一个在 Selenium WebDrive 上构建的更高层次的 API。

安装:

yarn add webdriverio chromedriver

例子:过滤 chromestatus.com 上的 CSS 功能:

const webdriverio = require('webdriverio');
const chromedriver = require('chromedriver');

// This should be the path to your Canary installation.
// I'm assuming Mac for the example.
const PATH_TO_CANARY = '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary';
const PORT = 9515;

chromedriver.start([
  '--url-base=wd/hub',
  `--port=${PORT}`,
  '--verbose'
]);

(async () => {

const opts = {
  port: PORT,
  desiredCapabilities: {
    browserName: 'chrome',
    chromeOptions: {
      binary: PATH_TO_CANARY // Screenshots require Chrome 60\. Force Canary.
      args: ['--headless']
    }
  }
};

const browser = webdriverio.remote(opts).init();

await browser.url('https://www.chromestatus.com/features');

const title = await browser.getTitle();
console.log(`Title: ${title}`);

await browser.waitForText('.num-features', 3000);
let numFeatures = await browser.getText('.num-features');
console.log(`Chrome has ${numFeatures} total features`);

await browser.setValue('input[type="search"]', 'CSS');
console.log('Filtering features...');
await browser.pause(1000);

numFeatures = await browser.getText('.num-features');
console.log(`Chrome has ${numFeatures} CSS features`);

const buffer = await browser.saveScreenshot('screenshot.png');
console.log('Saved screenshot...');

chromedriver.stop();
browser.end();

})();

更多资源

以下是一些可以带你入门的有用资源:

文档

工具

样例

  • "The Headless Web" - Paul Kinlan 发布的使用了 Headless 和 api.ai 的精彩博客

常见问题

我需要 --disable-gpu 标志吗?

目前是需要的。--disable-gpu 标志在处理一些 bug 时是需要的。在未来版本的 Chrome 中就不需要了。查看 https://crbug.com/546953#c152https://crbug.com/695212 获取更多信息。

所以我仍然需要 Xvfb 吗?

不。Headless Chrome 不使用窗口,所以不需要像 Xvfb 这样的显示服务器。没有它你也可以愉快地运行你的自动化测试。

什么是 Xvfb?Xvfb 是一个用于类 Unix 系统的运行于内存之内的显示服务器,可以让你运行图形应用程序(如 Chrome),而无需附加的物理显示器。许多人使用 Xvfb 运行早期版本的 Chrome 进行 “headless” 测试。

如何创建一个运行 Headless Chrome 的 Docker 容器?

查看 lighthouse-ci。它有一个使用 Ubuntu 作为基础镜像的 Dockerfile 示例,并且在 App Engine Flexible 容器中安装和运行了 Lighthouse。

我可以把它和 Selenium / WebDriver / ChromeDriver 一起使用吗?

是的。查看 Using Selenium, WebDrive, or ChromeDriver

它和 PhantomJS 有什么关系?

Headless Chrome 和 PhantomJS 是类似的工具。它们都可以用来在无需显示的环境中进行自动化测试。两者的主要不同在于 Phantom 使用了一个较老版本的 WebKit 作为它的渲染引擎,而 Headless Chrome 使用了最新版本的 Blink。

目前,Phantom 提供了比 DevTools protocol 更高层次的 API。

我在哪儿提交 bug?

对于 Headless Chrome 的 bug,请提交到 crbug.com

对于 DevTools 协议的 bug,请提交到 github.com/ChromeDevTools/devtools-protocol


作者简介

Eric Bidelman 谷歌工程师,Lighthouse 开发,Web 和 Web 组件开发,Chrome 开发


via: https://developers.google.com/web/updates/2017/04/headless-chrome

作者:Eric Bidelman 译者:firmianay 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出