Filipe Silva 8d2d93a7a2 feat(e2e): use protractor api (#4527)
Uses existing Protractor API to run it directly instead of using `npm run
e2e`.

Also adds support for the following flags: `--serve`, `--config`,
`--specs`, `--element-explorer`, `--webdriver-update`.

Fix #4256
Fix #4478

BREAKING CHANGE: `ng e2e` no longer needs `ng serve` to be running.
2017-02-09 15:14:29 -08:00

51 lines
1.8 KiB
TypeScript

import * as url from 'url';
import { E2eTaskOptions } from '../commands/e2e';
import { requireProjectModule } from '../utilities/require-project-module';
const Task = require('../ember-cli/lib/models/task');
export const E2eTask = Task.extend({
run: function (e2eTaskOptions: E2eTaskOptions) {
const projectRoot = this.project.root;
const protractorLauncher = requireProjectModule(projectRoot, 'protractor/built/launcher');
return new Promise(function () {
let promise = Promise.resolve();
let additionalProtractorConfig: any = {
elementExplorer: e2eTaskOptions.elementExplorer
};
// use serve url as override for protractors baseUrl
if (e2eTaskOptions.serve) {
additionalProtractorConfig.baseUrl = url.format({
protocol: e2eTaskOptions.ssl ? 'https' : 'http',
hostname: e2eTaskOptions.host,
port: e2eTaskOptions.port.toString()
});
}
if (e2eTaskOptions.specs.length !== 0) {
additionalProtractorConfig['specs'] = e2eTaskOptions.specs;
}
if (e2eTaskOptions.webdriverUpdate) {
// webdriver-manager can only be accessed via a deep import from within
// protractor/node_modules. A double deep import if you will.
const webdriverUpdate = requireProjectModule(projectRoot,
'protractor/node_modules/webdriver-manager/built/lib/cmds/update');
// run `webdriver-manager update --standalone false --gecko false --quiet`
promise = promise.then(() => webdriverUpdate.program.run({
standalone: false,
gecko: false,
quiet: true
}));
}
// Don't call resolve(), protractor will manage exiting the process itself
return promise.then(() =>
protractorLauncher.init(e2eTaskOptions.config, additionalProtractorConfig));
});
}
});