我如何 运行 使用无头浏览器进行测试?

How can I run tests with a headless browser?

使用:

ng test

Angular CLI 运行 默认情况下在 Chrome 中进行测试,这很好,但是如果我需要在仅控制台环境中 运行 它们怎么办(无头浏览器)?

另外,如果我每次 运行 都可以指定是否需要无浏览器,那就太好了,比如:

ng test --browsers MyHeadLessBrowser


编辑:

运行ning PhantomJS 我得到以下信息:

PhantomJS 2.1.1 (Linux 0.0.0) ERROR TypeError: useValue,useFactory,data is not iterable! at http://localhost:9876/_karma_webpack_/polyfills.bundle.js:854


eferenceError: Can't find variable: Intl in http://localhost:9876/_karma_webpack_/vendor.bundle.js (line 49362) intlDateFormat@http://localhost:9876/_karma_webpack_/vendor.bundle.js:49362:20

这应该可以解决问题:

npm i --save-dev karma-phantomjs-launcher

然后修改karma.conf.js文件的插件属性,将PhantomJS插件添加到列表中。同时将 PhantomJS 添加到浏览器 属性.

plugins: [
    require( 'karma-jasmine' ),
    require( 'karma-chrome-launcher' ),
    require( 'karma-phantomjs-launcher' ),
    require( 'karma-remap-istanbul' ),
    require( 'angular-cli/plugins/karma' )
],
...
browsers: [ 'PhantomJS', 'Chrome' ],

由于您想要完全无头的体验,您可以从浏览器 属性 中删除 Chrome,并从插件数组中删除 karma-chrome-launcher。

作为基于 William Hampshire 的一个更完整的答案,Cuga 的评论和我的个人添加。


简答:使用 ChromeHeadless

你可以直接使用 Headless Chrome:

ng test --browsers ChromeHeadless

您需要 Chrome 59+。

但是如果您需要 PhantomJS(and/or 改变默认 ng test 行为而不带参数)请阅读以下内容。


更长的答案:使用 PhantomJS

编辑: 请注意,PhantomJS 项目已 存档 ,请参阅 this thread

设置

为了能够(可选)运行您的测试无需浏览器,使用 PhantomJS,您应该:

1) 安装一些依赖:

npm install --save-dev karma-phantomjs-launcher
npm install --save intl

2) 将 PhantomJS 添加到 Karma 的插件列表

打开karma.conf.js,将require('karma-phantomjs-launcher')添加到plugins数组中,例如:

module.exports = function (config) {
  config.set({
    basePath: '',
    frameworks: ['jasmine', '@angular/cli'],
    plugins: [
      require('karma-jasmine'),
      require('karma-chrome-launcher'),
      require('karma-phantomjs-launcher'),
      // ...
    ],

3) 启用 polyfills

打开您的 src/polyfills.ts 文件并取消注释以下行:

浏览器填充

import 'core-js/es6/symbol';
import 'core-js/es6/object';
import 'core-js/es6/function';
import 'core-js/es6/parse-int';
import 'core-js/es6/parse-float';
import 'core-js/es6/number';
import 'core-js/es6/math';
import 'core-js/es6/string';
import 'core-js/es6/date';
import 'core-js/es6/array';
import 'core-js/es6/regexp';
import 'core-js/es6/map';
import 'core-js/es6/weak-map';
import 'core-js/es6/set';

应用程序导入

import 'intl';
import 'intl/locale-data/jsonp/en';

如何运行 测试

在运行执行命令时指定浏览器

不,您可以 运行 使用 Chrome 进行测试(angular-cli 默认值):

ng test --browsers Chrome

或 PhantomJS(无头):

ng test --browsers PhantomJS

仅更改 ng test

的默认行为

可以通过更改 karma.conf.jsbrowsers 数组的值来更改 ng test 的默认行为(因此当没有提供 --browsers 参数时) .

现在可以设置为仅使用 Chrome(默认 angular-cli 设置):

browsers: ['Chrome'],

PhantomJS:

browsers: ['PhantomJS'],

或者两者兼而有之:

browsers: ['Chrome', 'PhantomJS'],

Angular CLI 提供了我们在没有浏览器的情况下 运行 测试所需的一切。

打开 karma.conf.js 文件并将 ChromeHeadless 添加到浏览器数组 -

browsers: ['ChromeHeadless'],

测试愉快!

如果 运行 无头地进行此操作的目的是让您的代码 运行 在 CI 服务器上,您可能还需要设置 singleRun: true 在你的 karma.conf.js 中。没有这个 Karma 将持续 运行,然后超时。

Angular11 上的工作解决方案。

karma.conf.js

   browsers: ["ChromeHeadless"],
   singleRun: true

然后 运行 ng testng test --project=project_name.

这也适用于 CI 环境。

注意:这是此处两个不同答案的组合。