Protractor 似乎没有提供任何开箱即用的解决方案来在服务器运行之前启动它。在功能测试运行之前必须运行多个命令是一种糟糕的用户体验,也不利于自动化测试。
Angular-cli 有它自己的相当复杂的解决方案,这个插件声称可以复制它,尽管它对我不起作用并且可能没有维护。 https://www.npmjs.com/package/protractor-webpack
编辑:下面接受了更好的解决方案
我想出了一个使用 child_process.exec 的解决方案,虽然我不太喜欢它,但它似乎运行良好。我想分享它以防万一有人需要它,看看是否有人能提出更好的解决方案。
在 Protractor 的 beforeLaunch 钩子(Hook)中启动进程:
beforeLaunch: () => {
webpackServerProcess = exec(`webpack-dev-server --port=3003 --open=false`, null, () => {
console.log(`Webpack Server process reports that it exited. Its possible a server was already running on port ${port}`)
});
},
然后在配置 block 上方,我们设置了退出处理程序,以确保服务器在我们完成后被杀死。
let webpackServerProcess; // Set below in beforeLaunch hook
function cleanUpServer(eventType) {
console.log(`Server Cleanup caught ${eventType}, killing server`);
if (webpackServerProcess) {
webpackServerProcess.kill();
console.log(`SERVER KILLED`);
}
}
[`exit`, `SIGINT`, `SIGUSR1`, `SIGUSR2`, `uncaughtException`].forEach((eventType) => {
process.on(eventType, cleanUpServer.bind(null, eventType));
})
需要各种事件监听器来处理 cntrl+c 事件和进程被 ID 杀死的情况。奇怪的是节点没有提供包含所有这些的事件。
最佳答案
Protractor 也有 onCleanUp
,它将在文件中的所有规范完成后运行。
您通过保留对您的进程的引用来做正确的事情,以便您以后可以终止它。
let webpackServerProcess;
beforeLaunch: () {
webpackServerProcess = exec('blah'); // you could use spawn instead of exec
},
onCleanUp: () {
process.kill(webpackServerProcess.pid);
// or webpackServerProcess.exit();
}
由于您正在使用 child_process.exec 启动 serverProcess,而不是处于分离状态,如果主进程被 SIGINT 或其他任何东西杀死,它应该会消失。因此,您甚至不必杀死它或进行清理。
关于javascript - 如何在 Protractor 运行之前启动服务器并在之后进行清理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49365602/