javascript - 如何在 Protractor 运行之前启动服务器并在之后进行清理

标签 javascript protractor webpack-dev-server

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/

相关文章:

javascript - 使用 jQuery,当从下拉菜单中选择时,我需要从更改事件中捕获正确的变量

javascript - Bootstrap 4 滚动到 div

angularjs-e2e - 如何让 Protractor 在应用程序中间接管浏览器

javascript - 识别切换栏元素文本并在 Protractor 中单击它

webpack - manifest.json 中缺少条目

webpack - 获取 "Error: ` output.path`需要是绝对路径或者 `/`"

javascript - 如何在javascript中为没有值的标签选择属性

javascript - 验证用户身份,使用 XHR 请求重定向

javascript - mouseMove 不适用于 Selenium 和 Protractor

reactjs - 为什么 React 需要 webpack-dev-server 才能运行?