-
Notifications
You must be signed in to change notification settings - Fork 28
Open
Labels
Description
前言
记得前两年,nightmare还是很火的。所以,我在自己的前端脚手架也集成了它。不过,过去了那么久,不知道现在的形式如何。
因为最近发现面向的跨境项目业务越来越复杂,每个组员都负责着多个项目,一下做做A,一下做做B,然后有档期就会被安排做做跨境。因此,因为注意力不能集中,再加上对业务的不了解,就时不时会写一些影响到以前逻辑的bug。
这不得不让我们去规划做自动化回归测试的事情,虽然网站业务繁琐,但至少得保证每次组员的修改,不会影响主流程。
罗列
首先,我先罗列出我调研的e2e框架或库,让大家有个大体的认识。
- PhantomJS
英文解释:
Scriptable headless browser.
中文解释:
可编程无界面浏览器。
补充:
它就是一个浏览器,只是内部的点击、翻页等人为相关操作需要程序设计实现。
- NightmareJS
英文解释:
A high-level browser automation library. Under the covers it uses Electron, which is similar to PhantomJS but roughly twice as fast and more modern.
中文解释:
一个轻量级浏览器自动化测试库。基于Electron,和PhantomJS类似,但是快了大约2倍且更现代。
补充:
它的接口比PhantomJS友好很多,大大提高了开发效率:

而且,它还提供了chrome插件-daydream,它能够录制你在页面上的操作,并且生成对应的代码。这也是我为什么当初选择它的重要的原因之一。
但是,现在NightmareJS好像难产了,核心代码的更新是在一年多前,而且daydream的插件安装页面也404中。果断抛弃。
- Puppeteer
英文解释:
Puppeteer is a Node library which provides a high-level API to control Chrome or Chromium over the DevTools Protocol. Puppeteer runs headless by default, but can be configured to run full (non-headless) Chrome or Chromium.
中文解释:
Puppeteer是一个提供建立在DevTools协议(devtools-protocol),控制Chrome或Chromium的高阶API node库。Puppeteer默认无界面运行,不过可以通过配置变为有界面运行Chrome或Chromium。
补充:
它由Chrome DevTools维护,而且和NightmareJS一样,也提供了自动生成代码的Chrome插件-puppeteer-recorder。所以它完全可以替代NightmareJS,或者说就是NightmareJS凉了的原因吧。

Puppeteer还分puppeteer和puppeteer-core,区别可参阅 puppeteer-vs-puppeteer-core。
而且,Puppeteer如今已经可以跨浏览器,比如在Chrome、Firefox、Edge等浏览器上测试了。
总之,个人认为是最好的e2e自动化测试库。
- Selenium-webdriver
英文解释:
Selenium is a browser automation library. Most often used for testing web-applications, Selenium may be used for any task that requires automating interaction with the browser.
中文解释:
Selenium是一个浏览器自动化测试库。大都用来测试web应用,Selenium可以用来做任何需要和浏览器交互的任务。
补充:
底层基于webdriver实现,所以,可以自动化测试各种浏览器,只要对应的浏览器实现了webdriver功能(现代浏览器,IE是凉凉的)都可以用它来自动调起和测试。
启动浏览器的lancher/driver已经继承到selenium-webdriver中了:
const webdriver = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const firefox = require('selenium-webdriver/firefox');
let driver = new webdriver.Builder()
.forBrowser('firefox')
.setChromeOptions(/* ... */)
.setFirefoxOptions(/* ... */)
.build();- Nightwatch
英文解释:
End-to-end testing framework written in Node.js and using the Webdriver API.
中文解释:
Node.js调用Webdriver API实现的端到端(e2e)测试框架。
补充:
我们注意到,它是一个framework而不是一个library。之前介绍到的库的话,往往要结合其它库,比如mocha,chai等,然后通过一番折腾结合,才能实现完整的测试功能。
framework虽然也不是说不需要装任何额外的库或插件,但是,基础的东西,它都已经集成到框架中了,它能大大减少你的折腾时间。
同Selenium,它也是基于webdriver实现,所以,可以也自动化测试各种浏览器。
启动各个浏览器只需装对应浏览器的laucher/driver就好:
Geckodriver (Firefox):
Geckodriver is the WebDriver service used to drive the Mozilla Firefox Browser.
$ npm install geckodriver --save-dev
Chromedriver:
Chromedriver is the WebDriver service used to drive the Google Chrome Browser.
$ npm install chromedriver --save-dev- Protractor
英文解释:
E2E test framework for Angular apps.
中文解释:
为Angular应用而生的e2e测试框架。
分类
如图,我将这些测试库或框架,以底层实现的方式分为三类:
- devtools-protocol类;
- Webdriver类;
- 其它类;
-
devtools-protocol类,和Webdriver类类似,也是不局限某个特定浏览器,只要想测的浏览器有devtools-protocol能力就都可以跑自动化。

图片来源WICG/devtools-protocol -
其他类,比如Phantom,Nightmare这种,没有跨浏览器能力。
对比
Protractor太针对Angular了,所以就不加入对比:
| 名称 | 接口易用 | 框架 | 跨浏览器 | 自动生成代码插件 | 社区活跃 |
|---|---|---|---|---|---|
| PhantomJS | yes | ||||
| NightmareJS | yes | yes | |||
| Puppeteer | yes | yes | yes | yes | |
| Selenium | yes | yes | yes | ||
| Nightwatch | yes | yes | yes | yes |
所以,比对下来的结论就是:
- Puppeteer是首选;
马路边边
在调研的过程中,还发现了一款挺有意思的e2e测试框架——cypress。
它的优点:
它的缺点:
-
不跨浏览器
当我看到它文档的Unsupported-Browsers,我就觉得不香了; -
没有自动生成代码的插件
之前我们也看到了,非Webdriver虽然不能跨浏览器,但是毕竟是提供自动生成代码的插件,还是很方便的。所以,我就觉得它也不酷了,啥花里胡哨的东西。
总结
重要的话说两遍:
- Puppeteer是首选;



