Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I run tests with a headless browser?

Using:

ng test

Angular CLI runs the tests by default in Chrome, which is great, but what if I need to run them in a console-only environment (headless browser)?

Also it would be nice if I can specify if I want browser-less or not each time I run it, so something like:

ng test --browsers MyHeadLessBrowser


Edit:

running PhantomJS I got the following:

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

like image 392
Francesco Borzi Avatar asked Sep 25 '17 12:09

Francesco Borzi


People also ask

How do I run a test in headless mode?

You can execute any existing test in your automation project in headless mode by selecting that type of browser. Once you initiate the headless browser run in quick execution, you can continue interacting freely with your desktop. Since there is no UI loaded, you don't need to wait for the run to finish.

What is headless browser test?

Headless Browser Testing is a process of running the browser tests without the type of browser UI or GUI. In headless browser testing, to conduct cross-browser testing the tester can run test cases accurately and successfully without requiring the browser on which application needs to be tested.

How do I run Selenium tests in headless Chrome?

You can run Google Chrome in headless mode simply by setting the headless property of the chromeOptions object to True. Or, you can use the add_argument() method of the chromeOptions object to add the –headless command-line argument to run Google Chrome in headless mode using the Selenium Chrome web driver.

Can Selenium test web applications using headless browser?

In headless browsers, when Selenium tests run, they execute in the background. Almost all modern browsers provide the capabilities to run them in a headless mode. So, is headless testing possible using Selenium? Yes, Selenium supports headless testing.


3 Answers

As a more complete answer based on William Hampshire's one, Cuga's comment and my personal additions.


Short answer: using ChromeHeadless

You can just use Headless Chrome:

ng test --browsers ChromeHeadless

You need to have Chrome 59+.

But if you need PhantomJS (and/or chaning the default ng test behaviour with no arguments) read the following.


Longer answer: using PhantomJS

EDIT: Be aware that PhantomJS project has been archived, see this thread.

Setup

In order to be able to (optionally) run your tests without a browser, using PhantomJS, you should:

1) Install some dependencies:

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

2) Add PhantomJS to the Karma's plugin list

Open karma.conf.js and add require('karma-phantomjs-launcher') to the plugins array, for example:

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

3) Enable polyfills

Open your src/polyfills.ts file and uncomment the following lines:

BROWSER POLYFILLS

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';

APPLICATION IMPORTS

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

How to run the tests

Specifying the browsers when running the command

No you can either run the test using Chrome (the angular-cli default):

ng test --browsers Chrome

Or PhantomJS (headless):

ng test --browsers PhantomJS

Changing the default behaviour of just ng test

It is possible to change the default behaviour of ng test (so when no --browsers argument is provided) by changing the value of the browsers array in karma.conf.js.

It can now be set to just use Chrome (default angular-cli setup):

browsers: ['Chrome'],

or PhantomJS:

browsers: ['PhantomJS'],

or even both:

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

like image 131
Francesco Borzi Avatar answered Oct 19 '22 19:10

Francesco Borzi


This should do the trick:

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

Then modify the plugins property of the karma.conf.js file, adding the PhantomJS plugin to the list. Also add PhantomJS to the browsers property.

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

Since you want a completely headless experience, you can remove Chrome from the browsers property, and remove the karma-chrome-launcher from the plugins array as well.

like image 8
Kyle Krzeski Avatar answered Oct 19 '22 21:10

Kyle Krzeski


Angular provides all what we need to run tests without a browser.

Open the karma.conf.js file and add the ChromeHeadless to the browsers array -

browsers: ['ChromeHeadless'],

Happy testing!

like image 6
Dmitry Grinko Avatar answered Oct 19 '22 20:10

Dmitry Grinko