centos安装使用puppeteer和headless chrome

Google推出了无图形界面的headless Chrome之后,可以直接在远程服务器上直接跑一些测试脚本或者爬虫脚本了,猴开心!Google还附送了Puppeteer用于驱动没头的Chome。

阿里的Macaca也顺势写了Macaca-puppeteer,可以在Macaca上直接写通用的测试用例,在开发机上用图形界面看效果,上服务器走生产,岂不是美滋滋。

然鹅,可达鸭眉头一皱,发现事情并没有那么简单。

在阿里云的Centos 7.3上,安装puppeteer之后,会发现并不能启动官方的example:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.screenshot({path: 'example.png'});

  await browser.close();
})();

依赖安装

仔细看错误栈,核心的错误是如下一段:

...node_modules/puppeteer/.local-chromium/linux-496140/chrome-linux/chrome: error while loading shared libraries: libpangocairo-1.0.so.0: cannot open shared object file: No such file or directory

TROUBLESHOOTING: https://github.com/GoogleChro...

原来puppet虽然帮你下了一个Chromium,但并没有帮你把依赖都装好。于是你要自己把那些so都装好。

官方给的是Ubuntu版本的各个so包的apt-get安装方式,centos版本居然没有放!于是遍历了各个issue之后,终于发现还是有人给出了centos的库名,在一个看起来并不相关的issue里

#依赖库
yum install pango.x86_64 libXcomposite.x86_64 libXcursor.x86_64 libXdamage.x86_64 libXext.x86_64 libXi.x86_64 libXtst.x86_64 cups-libs.x86_64 libXScrnSaver.x86_64 libXrandr.x86_64 GConf2.x86_64 alsa-lib.x86_64 atk.x86_64 gtk3.x86_64 -y

#字体
yum install ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc -y

总算不用挨个去google了……

sandbox去沙箱

这时候你再去执行脚本,发现还是跑不起来。但是报错终于变了。这个时候变成了一个莫名其妙的错误:

(node:30559) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): Error: Failed to connect to chrome!
(node:30559) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

要疯掉了有没有,这啥玩意啊!!!!关键是这时候另外一个看起来是解决上面问题的issue,对这个错误进行了详细的讨论,然而直到今天(2017年9月27日)并没有讨论出什么结果。

网上很多讨论是说,直接调试那个Chrome。按照并不能解决问题的说法:直接去puppeteer的目录找到.local-chrome里面的Chromium执行文件,直接执行

./chrome -v --no-sandbox --disable-setuid-sandbox

(chrome:5333): Gtk-WARNING **: cannot open display: 

发现加上了--no-sanbox其实是能启动的,但是提示没有Gtk图形界面,那干脆加上--headless是不是就行了嘞?确实没有报错了。

回到puppeteer示例脚本,修改启动浏览器的代码,加上args:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch({args: ['--no-sandbox', '--disable-setuid-sandbox']});
  const page = await browser.newPage();
  await page.goto('https://example.com');
  await page.screenshot({path: 'example.png'});

  await browser.close();
})();

啊哈,终于执行成功了。下载下来了example.com的截图看了一眼,简直泪流满面。

回想一下,Puppet本身估计自带了--headless,所以如果直接去命令行执行chrome,还是要带上--headless。

终于搞定这一切发现Macaca顺便还提供了一个基于Ubuntu的Macaca-puppeteer的Docker,艾玛这方便太多了,早知道不自己折腾了。

杭州树洞网络科技 CTO

437 声望
7 粉丝
0 条评论
推荐阅读
deepin/ubuntu安装苹方字体
苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎: {代码...} 其中的PingFang SC可以说是中文字首位了。 然鹅,从网上下的苹方安装之后,死活都使用不上。仔细一看,发现安装的字体名为...

凤梨豪5阅读 11k评论 1

图解浏览器的多进程渲染机制
观察浏览器的任务管理器可以发现,打开浏览器的一个页面需要多个进程,包括浏览器进程、GPU 进程、网络进程、渲染进程等,有插件的话还会包括各种插件进程(Chrome 选项 -> 更多工具 -> 任务管理器)。

兰俊秋雨6阅读 736

前端性能指标
传统性能标准初始化阶段navigationStart:请求开始时间,返回 0unloadEventStart:等于用户代理程序开始前一个文档的卸载事件之前的时间unloadEventEnd:等于用户代理程序完成前一文档的卸载事件之后的时间redire...

散一群逗逼9阅读 896

封面图
使用浏览器录制屏幕
最近有一个录制屏幕的需求,类似于录制软件的操作教程给别人演示。在网上搜了一下录制屏幕,结果大多需要下载安装,而且有收费或者广告。无意间找到一个使用浏览器在线录屏的网站,出于好奇,研究了一下实现的方...

来了老弟5阅读 1.8k评论 10

封面图
Chrome 103支持使用本地字体,纯前端导出PDF优化
在前端导出PDF,解决中文乱码一直是一个头疼的问题。要解决这个问题,需要将ttf等字体文件内容注册到页面PDF生成器中。但是之前网页是没有权限直接获取客户机器字体文件,这时就需要从服务器下载字体文件或者提示...

葡萄城技术团队3阅读 13.9k

伪数组(ArrayLike)
伪数组(ArrayLike)伪数组的定义和特性伪数组 (ArrayLike) ,又称类数组。是一个类似数组的对象,但是有如下几个特征。按索引方式储存数据0: xxx, 1: xxx, 2: xxx...具有length属性但是length属性不是动态的,不会...

OceanZH7阅读 10.5k评论 3

vue 实现音乐模块🏄,已添加到github,动起来
预览效果🏄Github地址基于vuejs、vuex歌曲接口基于 QQ音乐API,可以查看 QQ音乐播放地址 API

jigsaw4阅读 2.4k

杭州树洞网络科技 CTO

437 声望
7 粉丝
宣传栏