首先我们先了解什么是有头浏览器和无头浏览器的区别,有头的话不用怎么说了,就是我们平时使用的浏览器,能看到图形化界面,和用户有深度的交互,那无头浏览器即 headless browser,是一种没有界面的浏览器。既然是浏览器那么浏览器该有的东西它都应该有,只是看不到界面,省去可视化,也就是说去除了用户交互的部分,那这样对于浏览器来说是提高了浏览器整体运行的效率,也提高自动化的兼容性稳定性,目前行业最流行的无头浏览器分别是 Puppeteer 和 PhantomJS,但后者已经不再维护了
说到这里大家也可能已经理解到现在大部分的在 docker 部署的浏览器都是无头的吧,因为 docker 本身就是不提供用户界面的,所以一般制作浏览器镜像都会优先考虑无头浏览器
但是,用过 docker 无头浏览器的小伙伴应该都会遇到一个问题,就是在测试浏览器外的交互,比如上传文件,这类型的用例基本是不可能实现的,所以无头浏览器 docker 环境作为自动化测试的一个载体存在一定的局限性,但是有局限也就有突破的方法,接下来就是讲解一下在 docker 里面我们是怎么使用有头浏览器来做自动化测试
从上面的一些问题我们能因引出测试需求,那就是解决如何在 docker 上做浏览器测试使其达到的效果和在我们平常使用的桌面环境上深度交互的运行效果,先直接一点,我们看看最后的效果
看到这个,大家应该也毕竟熟悉了,其实就是 Docker 的 NoVnc 的镜像,图形界面化 docker 环境,用浏览器直接打开就可以看到桌面,还可以直接操作,与一个普通界面操作系统基本无差,估计看到这里大家百度一下论坛搜一下都可以马上去用了,直接下个 novnc 镜像装个 macaca selenium 什么就跑一下脚本就能运行起来,很简单
但是,知其然,也要知其所以然,那接下来就和大家说一下这个能够运行有头浏览器的 docker 环境的一些技术栈以及它的构建过程
Xvfb
Xvfb 是 X virtual framebuffer 的简写,顾名思义,它最大的作用是可以代替完整的 X server 的功能,简单地说就是可以用虚拟的方式来模拟程序在有图形界面条件下运行的情况,大家现在用的大部分 docker 无头浏览器就是用到它,Xvfb 也是最重要的模块,没有这个模块的支撑的话我这篇文章可以不用写了
我们在做自动化测试的时候有一定的场景可以不用关注浏览器的整个运行过程,大部分时候都是执行等结果出报告就好,所以在做这种场景的测试的话可以先运行 xfvb,接着就按照平时自动化测试的流程去执行
对于 docker 本身要去安装这个模块的,以 ubuntu 镜像环境为例,首先安装 Xvfb
sudo apt-get install Xvfb
Xvfb :99 -ac 2>/dev/null &
export DISPLAY=:99
shell
>>firefox
FROM macaca-electron
EXPOSE 3456 22
ENTRYPOINT Xvfb -ac -screen scrn 1280x2000x24 :9.0 & \
export DISPLAY=:9.0 \
macaca server \
/usr/sbin/sshd -D
其中 macaca-electron 是自制的一个已经安装好 Xvfb 和 macaca 相关驱动的镜像,这里举例子,下面是没启动 Xvfb 时启动 macaca 执行自动化测试的情况
这里就直接报找不到 Xvfb 了,除了 macaca 大家也可以试试 selenium,基本是一样的错误
那启动之后的我们也试一下
VNC
对于 vnc 的部署安装可以参考附录二,或者直接使用现成的 docker 镜像,用docker search vnc可以搜出来,比如dorowu/ubuntu-desktop-lxde-vnc,然后在里面部署相关组件就可以用起来了
但是,只是通过 VNC 来进行自动化测试,是没办法模拟键盘和鼠标等一些操作,同时一些浏览器外的交互就实现不了,最明显的就是上传文件,那如果要解决这种场景,那基本上环境那块就要把浏览器外的环境也一起模拟进来,那就是接下来要讲的用 noVNC 的方式来解决这个问题
noVNC
最后实现的效果就是本文的第一张图片的运行情况,直接利用浏览器可以操作一个 linux 操作系统,然后其实就相当于一台现成的虚拟机,但在资源利用效率上就相对高效,部署文档可以参考附录三
整套流程如下图