![b3580eeb4787bf89c62c2f2618ce63fe.png](https://i-blog.csdnimg.cn/blog_migrate/19bceeed214c193106466a3923a0e1ce.jpeg)
puppeteer(下面简称pptr)是Google出的一款Chrome行为模拟开源软件。
含着金汤勺出生,从一开始就得到极大的关注。
在pptr出生之前,业界已经有非常好用的免费的开源浏览器模拟工具 selenium。selenium同样非常强大,并且支持Chrome,firefox,IE等等浏览器。那么支持Chrome浏览器行为模拟的pptr的竞争力在哪里呢?
我觉有以下几点:
- 超级简单&&fashion的API,完美支持async/await,让异步编程巨™简单
- 增强的模拟行为,对于webrtc等一些新的技术同样可以完美支持
- Google官方出品
当然这篇文章不是pptr的布道软文,我是想介绍linux下到底应该如何运行我们使用pptr开发的nodejs应用程序!
What?难道linux下面运行pptr开发的nodejs程序还会很困难?
是滴!而且是相当困难。
开发者使用pptr开发的nodejs程序往往在windows下面测试好好的,但是一旦部署到linux下面运行就各种报错,各种依赖库找不到,各种trouble,脑阔疼。。。。
为什么linux下面部署pptr开发的应用这么困难?
这很好理解,pptr模拟浏览器行为涉及到UI渲染,windows本身自带UI界面,一些UI相关的库(library)都已经是自带的了,所以自然在windows下面运行十分容易并且不会有什么坑。但是因为大部分Linux的发行版本都是不带UI界面的,纯命令行操作方式,这就注定其很多UI相关的依赖库找不到,所以pptr开发的应用程序在linux上部署这么困难就是这个原因!
有什么简单的解决办法么?
有的!你把自己开发的应用部署到windows或Ubuntu上面(记住Ubuntu的坑同样很多,只不过相比centos坑少很多)。
But!我们都知道大部分情况公司开发环境要求部署的都是linux并且是centos,这是何等的操蛋啊!!
所以我们有木有什么完美的解决办法呢?
别担心,官方已经给了办法,但是它并不完美!
官方还是很良心的,为广大开发者操碎了心,为此专门将“环境部署”相关的话题放在文档首页位置,看下面截图。
![3c83565e04cfdfaf23d502ac294a69cd.png](https://i-blog.csdnimg.cn/blog_migrate/d66b44620a97a44f744e9a858630102b.jpeg)
不出意外,这里面就是告诉开发者安装各种依赖,但是我安装了这些依赖还是不行啊! 我是一只要疯了的鸭鸭。。
而且官方的做法其实我不推荐,就算你在一台linux机器上面安装了这些依赖,花了半天成功了,那么下次换台机器呢?组长让你在另一个linux机器上再部署一个,怎么办?
所以终极究极无敌弯道超越曲线救国无法无天的pptr部署办法来了,
使用Docker!
路人:卧槽我不会Docker啊!
作者:没关系,Docker非常简单,而且你看了下面的文档绝逼一次成功,不成功评论区砍我。
为了我的教程的严谨性与可用性,我这里在我本机(windows10)重新安装一个纯净的centos7.3虚拟机。
安装虚拟机ing,大概半个小时。。。
好滴,现在虚拟机装好了。接下来我会快速说一下Docker的安装,其实Docker的安装也非常简单。
# 首先我们准备一下镜像,这些在官方教程都有,我这里简化一下,文章末尾会给出官方教程链接
sudo yum install -y yum-utils
接下来我们创建一个使用pptr的nodejs程序,程序非常简单:打开baidu然后截图保存到磁盘。
好,我们开始吧!
# 我们创建一个空的文件夹
mkdir pptr-demo
cd pptr-demo
接着我们创建package.json文件
{
然后我们创建index.js文件
const
创建Dockerfile文件,文件名就叫Dockerfile,没有后缀名哦!
# 这里是别人已经搭建好的的一个pupptr运行换季环境
FROM buildkite/puppeteer
WORKDIR /app
# 把当当前目录的模样 所有内容都拷贝到 app工作目录
COPY . /app
RUN npm install -g yarn
RUN yarn install
# 完成
到这里,如果你在命令行敲击 ls 命令,应该能看到下面3个文件,如果不是,说明你有步骤没有完成。
![bd482e409b93165641d1db88499c8674.png](https://i-blog.csdnimg.cn/blog_migrate/d7848693b3b3af7dac33585bc67e9484.png)
接下来的操作仍然在当前路径操作,不要切换路径。
创建Docker镜像
# 不要忘记最后有一个点
docker build --tag=pptr-image .
# 这里我们把镜像的名称叫做pptr-image
# 创建镜像需要一些时间,请耐心等待
使用我们刚刚创建的镜像启动一个实例(实例也称为container)
docker run -it pptr-image bash
# 然后在出现的新的命令行交互界面敲击
node index.js
# 等待index.js脚本运行完成,敲击
ls
#然后你会看到多了一个文件叫做 example.png
# 这个example.png就是我们程序中访问百度页面然后截图保存的图片
当你看到example.png文件后,我们所有的操作就都完成了。
如你所见,我们的pptr应用程序正常启动并且正常运行了,这一切多亏了Docker还有别人已经给我们做好的 buildkite/puppeteer 镜像,这个镜像中已经安装好了 pptr 在linux环境运行时候所需要的一些环境依赖。
你真的不需要去关心环境依赖,关注与你的代码逻辑会让你工作更加高效更加有成就感,熟悉各种复杂环境搭建不是一个程序员的核心竞争力,而且它会让你非常烦恼。
最后我把上面全部的命令行操作都用 asciinema 工具记录下来了,点击图片就可以看到全部过程。在全部录制过程中,我出了一次重大错误,就是index.js写的不对,pptr初始化的时候需要提供额外的参数,缺少此参数无法在linux下面运行。
录制页面地址 puppeteer with Docker example
就在我刚刚写完这篇文章,合肥出现轻微地震,震源来自台湾6.1级地震,表面毫无波澜,内心恍如老狗,写下最后一行字提交逃出大楼。
链接:
- docker官方安装教程(英文)
- Github 讨论 : linux下安装失败的问题讨论以及网友建议(Google官方)