99

Is it possible to redirect or capture Cypress browser log and command log to output?

I read some Cypress github issues on this topic. But I don't know how to make it work.

Basically, I want to capture all the Cypress GUI command logs in the headless non-GUI mode. If I can include browser console log will be even better. The purpose is to understand what happened when a test fails.

I use teamcity as ci. Here is an example of my build log. I want to see all the command log here too. Actually, any console.log run on the server side using cy.task is displayed in the build log. Running cy.task('log',message) is too manual. Any smarter ways?

[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] └─────────────────────────────────────┘ 
6
  • It looks like they are trying to produce an all-encompassing feature rather than a simple hook, which is what most people seem to want. jantoebe's code here looks promising. Might be worth asking him where he adds it in the tests. Commented Aug 29, 2018 at 20:47
  • How about sending client's browser log back to the server? Using jantoebe's idea of replacing console and somehow send the log back to node's console log. Do I need to make an endpoint to listen on a port using cy.task? Commented Aug 29, 2018 at 22:02
  • Use something like this github.com/krakenjs/beaver-logger. It might be an overkill. Commented Aug 29, 2018 at 22:03
  • Yes, definitely a cy.task to run the code into Node env. Then just fs to a file, but with some nice formatting. I am also interested in capturing the command log formatted html (not just the test) for documentation, so document.getElementById('root').innerHTML looks like the way to do that. Commented Aug 29, 2018 at 23:18
  • 1
    Please also see cypress-failed-log which enumerates the commands - looks quite useful for CI scenario. Commented Aug 30, 2018 at 0:53

8 Answers 8

117

As of Cypress 3.0.0, you can use cy.task() to access node directly and output to the node console. From the docs:

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

See here for more info.

I don't know of a way to mirror the Cypress logs to the console directly, but this is at least a workable alternative.

Sign up to request clarification or add additional context in comments.

2 Comments

Somehow this is not working for me. I'm on latest Cypress version.
@AmitKumarGupta This answer was taken directly from the doc page for cy.task. If you follow the steps from the latest documentation and it doesn't work, then you may have found a bug, which you can report on Github.
51

Setting the ELECTRON_ENABLE_LOGGING environment variable to 1 will cause all Chrome internal logging to be printed to the console.

ELECTRON_ENABLE_LOGGING=1 npx cypress run 

ELECTRON_ENABLE_LOGGING

Prints Chrome's internal logging to the console.

With this enabled, in addition to capturing any existing logging, this will also allow you to manually log within a test using console.log:

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

6 Comments

Too bad that this only works when tests run in electron, and not e.g. when using chrome (ELECTRON_ENABLE_LOGGING=1 npx cypress run --browser chrome)
@LGenzelis even with electron its not working for me
hey @wamster , check my answer. Or just go to npmjs.com/package/cypress-terminal-report. It's been a game changer for me :)
That plugin specifically does not log requests to console.log: "console.log usage was never meant to be used in the cypress test code. Using it will not log anything with this plugin." So while this is super useful in capturing calls to cy.log it doesn't address the half of the question requesting logging console.log.
That's wrong, I've been using the plugin for years now, and it works great. Just in case, it refers to console.logs invoked in your application, not in your tests. So, if you want to use console.log in your test instead of cy.log (for whatever reason), you need to do cy.window().then((win) => win.console.log('qwerty'))
@LGenzelis Looks like that answer was deleted the same day you posted it, since it didn't explain how the plugin helped solve this issue.
10

FYI:

Cypress community is going to provide native support so that we don't have to do any workarounds to print the logs on non-GUI(headless) CLI.

Ongoing issue: https://github.com/cypress-io/cypress/issues/448 includes reference to 3 existing workarounds https://github.com/cypress-io/cypress/issues/448#issuecomment-613236352

1 Comment

Sadly, they decided to only fix it for cloud customers :(
9

Expanding on @Joshua-wade's answer, you can overwrite cy.log to redirect all calls to it to the log task. Just as the following:

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

Note: there's a small drawback to this: when you run the test using the Test Runner, instead of seeing LOG my message in the command log, you'll see TASK log, my message. But IMHO it's negligible.

1 Comment

when i try this i get The 'task' event has not been registered in the setupNodeEvents method. You must register it before using cy.task() - Cypress: 10.7.0
6
// cypress.config.js const { defineConfig } = require("cypress"); module.exports = defineConfig({ projectId: "cnpkrh", e2e: { setupNodeEvents(on, config) { on('task', { log(message) { console.log(message); return null; }, }); }, }, }); // cypress/e2e/spec.cy.js cy.task('log', 'This will be output to the terminal') 

2 Comments

This is a very good alternative and worked for me. Especially simply using: cy.task('log', 'This will be output to the terminal') anywhere in the code.
A good followup to this is to override the log function if in headless mode. See hughsk's answer here: stackoverflow.com/a/73827995/5327131
3

Disclaimer: I am the plugin author

You can capture Cypress CI GUI commands in headless mode, together with all the network requests, browser console messages and DOM tree changes using this free open-source plugin: https://github.com/currents-dev/cypress-debugger

As an alternative, you can also use a set of other well-known plugins:

Comments

1

I agree with Araon's approach using overwrite on the log function. Another approach, if you want to keep cy.log the default behavior, would be create a custom command. Doc here

Example: Cypress.Commands.add("printLog", (message) => { cy.task("log", {message}); })

This way you can call function printLog vs cy.task("log", {message});

Comments

1

You could use the very handy cypress-terminal-report plugin.

This provides verbose output on failure including:

  • Commands given
  • Network calls made along with their responses before and after those commands
  • Any console logs or error output

For me, it's a must-have tool to improve Cypress E2E.

4 Comments

This plugin specifically does not log requests to console.log: "console.log usage was never meant to be used in the cypress test code. Using it will not log anything with this plugin." So while this is super useful in capturing calls to cy.log it doesn't address the half of the question requesting logging console.log.
The quote says it doesn't log requests in your Cypress test code; but it "logs all commands, requests and browser console logs" and that's exactly what the question asks for.
Sorry, replace "log requests" by "log console.log calls".
You can see cons:log in the screenshot in the readme as an example (and cons:warn, cons:error etc.)

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.