赛普拉斯管道 console.log 和命令日志输出

Posted

技术标签:

【中文标题】赛普拉斯管道 console.log 和命令日志输出【英文标题】:Cypress pipe console.log and command log to output 【发布时间】:2019-02-03 19:39:04 【问题描述】:

是否可以重定向或捕获赛普拉斯浏览器日志和命令日志以输出?

我在这个主题上阅读了一些 Cypress github issues。但我不知道如何使它工作。

基本上,我想在无头非 GUI 模式下捕获所有 Cypress GUI 命令日志。如果我可以包含浏览器控制台日志会更好。目的是了解测试失败时发生了什么。

我使用 teamcity 作为 ci。这是我的构建日志的示例。我也想在这里查看所有命令日志。实际上,任何使用cy.task 在服务器端运行的console.log 都会显示在构建日志中。运行cy.task('log',message) 太手动了。还有更聪明的方法吗?

[09:49:08][Step 1/1] 2 of 4: new actions (52s)
[09:50:00][Step 1/1] 3 of 4: new actions (52s)
[09:50:53][Step 1/1] 4 of 4: new actions (53s)
[09:51:47][Step 1/1]   (Results)
[09:51:47][Step 1/1] 
[09:51:47][Step 1/1]   ┌─────────────────────────────────────┐
[09:51:47][Step 1/1]   │ Tests:        8                     │
[09:51:47][Step 1/1]   │ Passing:      8                     │
[09:51:47][Step 1/1]   │ Failing:      0                     │
[09:51:47][Step 1/1]   │ Pending:      0                     │
[09:51:47][Step 1/1]   │ Skipped:      0                     │
[09:51:47][Step 1/1]   │ Screenshots:  0                     │
[09:51:47][Step 1/1]   │ Video:        true                  │
[09:51:47][Step 1/1]   │ Duration:     3 minutes, 38 seconds │
[09:51:47][Step 1/1]   │ Estimated:    1 minute, 8 seconds   │
[09:51:47][Step 1/1]   │ Spec Ran:     action/action_spec.js │
[09:51:47][Step 1/1]   └─────────────────────────────────────┘

【问题讨论】:

看起来他们正在尝试产生一个包罗万象的功能,而不是一个简单的钩子,这是大多数人似乎想要的。 jantoebe 的代码here 看起来很有希望。可能值得问问他在测试中将其添加到哪里。 如何将客户端的浏览器日志发送回服务器?使用 jantoebe 替换 console 的想法,并以某种方式将日志发送回节点的控制台日志。我是否需要使用cy.task 创建一个端点来监听端口? 使用类似github.com/krakenjs/beaver-logger的东西。这可能有点矫枉过正。 是的,绝对是 cy.task 将代码运行到 Node 环境中。然后只是 fs 到一个文件,但有一些很好的格式。我也有兴趣为文档捕获命令日志格式的 html(不仅仅是测试),所以 document.getElementById('root').innerHTML 看起来是这样做的方法。 另请参阅 cypress-failed-log 枚举命令 - 看起来对 CI 场景非常有用。 【参考方案1】:

ELECTRON_ENABLE_LOGGING 环境变量设置为1 将导致所有Chrome 内部日志都打印到控制台。

ELECTRON_ENABLE_LOGGING=1 npx cypress run

ELECTRON_ENABLE_LOGGING

将 Chrome 的内部日志打印到控制台。

启用此功能后,除了捕获任何现有日志记录之外,您还可以使用console.log 在测试中手动记录:

console.log('Response JSON: ' + json)

【讨论】:

太糟糕了,这只适用于在电子中运行的测试,而不是例如使用 chrome 时 (ELECTRON_ENABLE_LOGGING=1 npx cypress run --browser chrome)【参考方案2】:

仅供参考:

Cypress 社区将提供本地支持,这样我们就不必采取任何变通办法来在非 GUI(无头)CLI 上打印日志。

持续问题:https://github.com/cypress-io/cypress/issues/448

【讨论】:

【参考方案3】:

扩展@Jos​​hua-wade 的答案,您可以覆盖cy.log 以将对其的所有调用重定向到日志任务。如下:

Cypress.Commands.overwrite('log', (subject, message) => cy.task('log', message));

注意:这样做有一个小缺点:当您使用 Test Runner 运行测试时,您将看到 TASK log, my message,而不是在命令日志中看到 LOG my message。但恕我直言,这可以忽略不计。

【讨论】:

【参考方案4】:

从 Cypress 3.0.0 开始,您可以使用cy.task() 直接访问节点并输出到节点控制台。来自文档:

// in test
cy.task('log', 'This will be output to the terminal')
// in plugins file
on('task', 
  log (message) 
    console.log(message)
    return null
  
)

请参阅here 了解更多信息。

我不知道将赛普拉斯日志直接镜像到控制台的方法,但这至少是一种可行的选择。

【讨论】:

不知何故这对我不起作用。我使用的是最新的 Cypress 版本。 @AmitKumarGupta 这个答案直接取自the doc page for cy.task。如果您按照最新文档中的步骤操作,但它不起作用,那么您可能发现了一个错误,您可以report on Github。

以上是关于赛普拉斯管道 console.log 和命令日志输出的主要内容,如果未能解决你的问题,请参考以下文章

赛普拉斯:如何从自定义命令中获取返回值? (柏树承诺)

赛普拉斯自定义命令无法识别

当文件缓存在磁盘上时,赛普拉斯拦截不起作用

赛普拉斯在多项测试中冻结

赛普拉斯 - 如何按顺序运行测试文件

赛普拉斯报告者结果文件名