【发布时间】:2018-06-21 12:34:16
【问题描述】:
对于非 Angular 项目,我正在尝试复制 Angular CLI 在您使用 ng e2e 时所做的事情——不仅运行 Protractor,而且首先启动开发服务器,并在 Protractor 运行时干净地关闭它完成。
我有一些工作,但我检查 webpack-dev-server 是否成功启动的方式 - 寻找特定消息“webpack:编译成功”。通过stdout —— 看起来像一个丑陋的黑客。而且我将stdout 和stderr 传递给带有pipe 的节点进程的方式也没有产生我期望的所有输出。
这是我目前的protractor.conf.js(还有一堆调试控制台语句,我稍后会清理):
const { SpecReporter } = require('jasmine-spec-reporter');
const spawn = require('child_process').spawn;
let webpackServerProcess;
exports.config = {
allScriptsTimeout: 11000,
specs: [
'./e2e/**/*.e2e-spec.ts'
],
capabilities: {
'browserName': 'chrome'
},
directConnect: true,
baseUrl: 'http://localhost:4200/',
framework: 'jasmine',
jasmineNodeOpts: {
showColors: true,
defaultTimeoutInterval: 30000,
print: function() {}
},
beforeLaunch() {
return new Promise((resolve, reject) => {
let resolved = false;
let rejected = false;
webpackServerProcess = spawn('webpack-dev-server', ['--port=4200']);
webpackServerProcess.stdout.pipe(process.stdout);
webpackServerProcess.stderr.pipe(process.stderr);
webpackServerProcess.stdout.addListener('data', chunk => {
const msg = chunk.toString();
if (msg.indexOf('webpack: Compiled successfully.') >= 0) {
resolved = true;
resolve();
}
else if (!resolved && msg.indexOf('webpack:') >= 0) {
rejected = true;
reject(msg);
}
});
function done() {
if (!resolved && !rejected)
reject('webpack-dev-server terminated unexpectedly');
}
webpackServerProcess.addListener('close', (code, signal) => {
console.log('*** close: ' + code + ', ' + signal);
done();
});
webpackServerProcess.addListener('exit', (code, signal) => {
console.log('*** exit: ' + code + ', ' + signal);
done();
});
webpackServerProcess.addListener('disconnect', () => {
console.log('*** disconnect');
done();
});
webpackServerProcess.addListener('message', msg => console.log('*** message: ' + msg));
webpackServerProcess.addListener('error', error => console.log('*** error: ' + error));
});
},
onPrepare() {
console.log('onPrepare()');
require('ts-node').register({
project: 'e2e/tsconfig.e2e.json'
});
jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } }));
},
onCleanUp() {
console.log('onCleanUp()');
if (webpackServerProcess && !webpackServerProcess.killed) {
try {
process.kill(webpackServerProcess.pid);
}
catch (error) {}
}
}
};
任何改进建议将不胜感激。我发现了一些与此主题相关的其他线程,但没有得出明确的结论。
【问题讨论】:
标签: javascript node.js webpack protractor end-to-end