In #35049, integration and AIO tests were changed to use the browser provided by `puppeteer` in tests. This commit switches the docs examples tests to use the same setup. IMPLEMENTATION NOTE: The examples are used to create ZIP archives that docs users can download to experiment with. Since we want the downloaded projects to resemble an `@angular/cli` generated project, we do not want to affect the project's Protractor configuration in order to use `puppeteer`. To achieve this, a second Protractor configuration is created (which is ignored when creating the ZIP archives) that extends the original one and passes the approperiate arguments to use the browser provided by `puppeteer`. This new configuration (`protractor-puppeteer.conf.js`) is used when running the docs examples tests (on CI or locally during development). PR Close #35381
		
			
				
	
	
		
			166 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			166 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| // FIRST TIME ONLY- run:
 | |
| //   ./node_modules/.bin/webdriver-manager update
 | |
| //
 | |
| //   Try: `npm run webdriver:update`
 | |
| //
 | |
| // AND THEN EVERY TIME ...
 | |
| //   1. Compile with `tsc`
 | |
| //   2. Make sure the test server (e.g., http-server: localhost:8080) is running.
 | |
| //   3. ./node_modules/.bin/protractor protractor.config.js
 | |
| //
 | |
| //   To do all steps, try:  `npm run e2e`
 | |
| 
 | |
| var fs = require('fs');
 | |
| var path = require('canonical-path');
 | |
| var _ = require('lodash');
 | |
| 
 | |
| 
 | |
| exports.config = {
 | |
|   directConnect: true,
 | |
| 
 | |
|   // Capabilities to be passed to the webdriver instance.
 | |
|   capabilities: {
 | |
|     browserName: 'chrome',
 | |
|     chromeOptions: {
 | |
|       binary: require('puppeteer').executablePath(),
 | |
|       // See /integration/README.md#browser-tests for more info on these args
 | |
|       args: ['--no-sandbox', '--headless', '--disable-gpu', '--disable-dev-shm-usage', '--hide-scrollbars', '--mute-audio'],
 | |
|     },
 | |
|   },
 | |
| 
 | |
|   // Framework to use. Jasmine is recommended.
 | |
|   framework: 'jasmine',
 | |
| 
 | |
|   // For angular tests
 | |
|   useAllAngular2AppRoots: true,
 | |
| 
 | |
|   // Base URL for application server
 | |
|   baseUrl: 'http://localhost:8080',
 | |
| 
 | |
|   // doesn't seem to work.
 | |
|   // resultJsonOutputFile: "foo.json",
 | |
| 
 | |
|   onPrepare: function() {
 | |
|     //// SpecReporter
 | |
|     //var SpecReporter = require('jasmine-spec-reporter');
 | |
|     //jasmine.getEnv().addReporter(new SpecReporter({displayStacktrace: 'none'}));
 | |
|     //// jasmine.getEnv().addReporter(new SpecReporter({displayStacktrace: 'all'}));
 | |
| 
 | |
|     // debugging
 | |
|     // console.log('browser.params:' + JSON.stringify(browser.params));
 | |
| 
 | |
|     jasmine.getEnv().addReporter(new Reporter( browser.params ));
 | |
|   },
 | |
| 
 | |
|   jasmineNodeOpts: {
 | |
|     // defaultTimeoutInterval: 60000,
 | |
|     defaultTimeoutInterval: 10000,
 | |
|     showTiming: true,
 | |
|     print: function() {}
 | |
|   },
 | |
| 
 | |
|   beforeLaunch: function() {
 | |
|     // add TS support for specs
 | |
|     require('ts-node').register({
 | |
|       project: './tsconfig.json'
 | |
|     });
 | |
|   }
 | |
| };
 | |
| 
 | |
| // See http://jasmine.github.io/2.1/custom_reporter.html
 | |
| function Reporter(options) {
 | |
|   var _defaultOutputFile = path.resolve(__dirname, '../../protractor-results.txt');
 | |
|   options.outputFile = options.outputFile || _defaultOutputFile;
 | |
| 
 | |
|   var _root = { appDir: options.appDir, suites: [] };
 | |
|   log('AppDir: ' + options.appDir, +1);
 | |
|   var _currentSuite;
 | |
| 
 | |
|   this.suiteStarted = function(suite) {
 | |
|     _currentSuite = { description: suite.description, status: null, specs: [] };
 | |
|     _root.suites.push(_currentSuite);
 | |
|     log('Suite: ' + suite.description, +1);
 | |
|   };
 | |
| 
 | |
|   this.suiteDone = function(suite) {
 | |
|     var statuses = _currentSuite.specs.map(function(spec) {
 | |
|       return spec.status;
 | |
|     });
 | |
|     statuses = _.uniq(statuses);
 | |
|     var status = statuses.indexOf('failed') >= 0 ? 'failed' : statuses.join(', ');
 | |
|     _currentSuite.status = status;
 | |
|     log('Suite ' + _currentSuite.status + ': ' + suite.description, -1);
 | |
|   };
 | |
| 
 | |
|   this.specStarted = function(spec) {
 | |
| 
 | |
|   };
 | |
| 
 | |
|   this.specDone = function(spec) {
 | |
|     var currentSpec = {
 | |
|       description: spec.description,
 | |
|       status: spec.status
 | |
|     };
 | |
|     if (spec.failedExpectations.length > 0) {
 | |
|       currentSpec.failedExpectations = spec.failedExpectations;
 | |
|     }
 | |
| 
 | |
|     _currentSuite.specs.push(currentSpec);
 | |
|     log(spec.status + ' - ' + spec.description);
 | |
|     if (spec.status === 'failed') {
 | |
|       spec.failedExpectations.forEach(function(err) {
 | |
|         log(err.message);
 | |
|       });
 | |
|     }
 | |
|   };
 | |
| 
 | |
|   this.jasmineDone = function() {
 | |
|     outputFile = options.outputFile;
 | |
|     //// Alternate approach - just stringify the _root - not as pretty
 | |
|     //// but might be more useful for automation.
 | |
|     // var output = JSON.stringify(_root, null, 2);
 | |
|     var output = formatOutput(_root);
 | |
|     fs.appendFileSync(outputFile, output);
 | |
|   };
 | |
| 
 | |
|   // for output file output
 | |
|   function formatOutput(output) {
 | |
|     var indent = '  ';
 | |
|     var pad = '  ';
 | |
|     var results = [];
 | |
|     results.push('AppDir:' + output.appDir);
 | |
|     output.suites.forEach(function(suite) {
 | |
|       results.push(pad + 'Suite: ' + suite.description + ' -- ' + suite.status);
 | |
|       pad+=indent;
 | |
|       suite.specs.forEach(function(spec) {
 | |
|         results.push(pad + spec.status + ' - ' + spec.description);
 | |
|         if (spec.failedExpectations) {
 | |
|           pad+=indent;
 | |
|           spec.failedExpectations.forEach(function (fe) {
 | |
|             results.push(pad + 'message: ' + fe.message);
 | |
|           });
 | |
|           pad=pad.substr(2);
 | |
|         }
 | |
|       });
 | |
|       pad = pad.substr(2);
 | |
|       results.push('');
 | |
|     });
 | |
|     results.push('');
 | |
|     return results.join('\n');
 | |
|   }
 | |
| 
 | |
|   // for console output
 | |
|   var _pad;
 | |
|   function log(str, indent) {
 | |
|     _pad = _pad || '';
 | |
|     if (indent == -1) {
 | |
|       _pad = _pad.substr(2);
 | |
|     }
 | |
|     console.log(_pad + str);
 | |
|     if (indent == 1) {
 | |
|       _pad = _pad + '  ';
 | |
|     }
 | |
|   }
 | |
| 
 | |
| }
 |