【问题标题】:Open Karma debug.html page on startup启动时打开 Karma debug.html 页面
【发布时间】:2015-10-08 18:40:01
【问题描述】:

简短版:

如何启动 Karma 并让它在与 Karma 起始页相同的浏览器中自动打开 debug.html 文件?

长版:

我不太喜欢使用控制台报告器来处理 Karma,所以我一直在使用 karma-jasmine-html-reporter-livereload,它输出到 Karma 的 localhost:9876/debug.html 文件。问题是,每次我开始调试会话时,我都必须单击 karma 打开的网页中的“调试”按钮。

我想找到一种方法让 karma 通过 gulp 任务自动打开 debug.html 页面。我在多个浏览器中运行测试,因此我希望 debug.html 页面在 Karma 打开的每个浏览器中作为第二个选项卡打开。我还希望能够在业力关闭时关闭该 debug.html 选项卡。我尝试了很多东西,但没有成功。

这是我的 gulp 任务。 “监视”任务监视我的源 TypeScript 文件并将它们编译成 javascript……没什么特别的。

gulp.task('watch-test', ['watch'], function (done) {
    //start a livereload server so that the karma html 
    //reporter knows to reload whenever the scripts change
    livereload.listen(35729);
    gulp.watch('dist/src/**/*.js').on('change', livereload.changed);

    new KarmaServer({
        configFile: __dirname + '/karma.conf.js',
        singleRun: false
    }, done).start();
});

【问题讨论】:

  • 我同意,每次都必须点击它很烦人,尤其是在使用 karma-jasmine-html-reporter-livereload 时。我一直在想同样的事情。你能发布你已经尝试过的东西,这样我就不会重新发明你的轮子了吗?

标签: javascript node.js debugging gulp karma-runner


【解决方案1】:

我找到了一种让它永久化的方法,尽管它并不完美。你可以在上下文中注入一个 javascript:

files: [
    "test/init.js",
    ...
]

并将这段代码放入文件中:

(function (window) {
    if (!window.parent.initDone && window.location.pathname === '/context.html') {
         window.parent.initDone = true;
         window.open('/debug.html', '_blank');
    }
})(window)

这将确保该窗口仅在第一次运行测试时打开,并且仅在 context.html 中执行。

您可以在该块中添加任何您希望的初始化代码。

【讨论】:

  • 还有一点点小技巧,但这正是我所需要的!好在我可以签入该文件,现在团队中的每个人都可以零配置获得此功能。谢谢!
  • 我将它与 karma 的 customLaunchers 设置结合使用,将 --auto-open-devtools-for-tabs'--user-data-dir=' + path.resolve(__dirname, './.chrome') 标志传递给 Chrome,从而导致在同一个地方打开的窗口已经使用相同的 devtools 布局每次运行都打开调试选项卡。
【解决方案2】:

您可以使用customLauncher 浏览器定义:

  customLaunchers: {
    ChromeDebugging: {
      base: 'Chrome',
      flags: [ '--remote-debugging-port=9333', '--auto-open-devtools-for-tabs', 'http://localhost:9876/debug.html' ]
    }
  }

并在您的业力配置中使用此浏览器。

【讨论】:

  • 这会打开 debug.html 页面和默认页面。
【解决方案3】:

我想不出一个优雅的方法来做到这一点,所以这是一个肮脏、低调、不好、腐烂、完全可耻的作弊,但它确实有效。 :)

在 node_modules > karma > static > karma.js 我添加了以下几行:

var debugWin = window.open('http://localhost:7676/debug.html','Debugme');
debugWin.focus();

如下所示,从第 366 行开始(在 0.13.19 版中):

  var updateBanner = function (status) {
    return function (param) {
      var paramStatus = param ? status.replace('$', param) : status
      titleElement.innerHTML = 'Karma v' + VERSION + ' - ' + paramStatus
      bannerElement.className = status === 'connected' ? 'online' : 'offline'
    }
  }

  var debugWin = window.open('http://localhost:7676/debug.html','Debugme');
  debugWin.focus();

  socket.on('connect', updateBanner('connected'))
  socket.on('disconnect', updateBanner('disconnected'))
  socket.on('reconnecting', updateBanner('reconnecting in $ ms...'))
  socket.on('reconnect', updateBanner('connected'))
  socket.on('reconnect_failed', updateBanner('failed to reconnect'))
  socket.on('info', updateBrowsersInfo)
  socket.on('disconnect', function () {
    updateBrowsersInfo([])
  })
}

享受。你叛逆,你。

【讨论】:

  • 很有创意。 :) 不幸的是,这并不完全具有我正在寻找的持久性。如果我清除了我的 node_modules 文件夹,或者我团队中的其他人拉下代码并运行它,除非我还签入 node_modules 文件夹中至少包含此文件,否则不会为他们保留此更改。
  • 像我说的那样,又脏又臭。如果您想出任何更永久的东西,请务必在此处发布!
猜你喜欢
  • 1970-01-01
  • 2019-11-07
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2018-03-15
  • 2021-08-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多