Execute a system command.
Anti-Pattern
Don't try to start a web server from
cy.exec().Read about best practices here.
cy.exec(command)
cy.exec(command, options)
Correct Usage
cy.exec('npm run build')
command (String)
The system command to be executed from the project root (the directory that contains the default cypress.json configuration file).
options (Object)
Pass in an options object to change the default behavior of cy.exec().
| Option | Default | Description |
|---|---|---|
log |
true |
Displays the command in the Command log |
env |
{} |
Object of environment variables to set before the command executes (e.g. {USERNAME: 'johndoe'}). Will be merged with existing system environment variables |
failOnNonZeroExit |
true |
whether to fail if the command exits with a non-zero code |
timeout |
execTimeout |
Time to wait for cy.exec() to resolve before timing out
|
cy.exec() yields an object with the following properties:
codestdoutstderrcy.exec() provides an escape hatch for running arbitrary system commands, so you can take actions necessary for your test outside the scope of Cypress. This is great for:
cy.exec('npm run build').then((result) => {
// yields the 'result' object
// {
// code: 0,
// stdout: "Files successfully built",
// stderr: ""
// }
})
cy.exec('rake db:seed').its('code').should('eq', 0)
cy.exec('npm run my-script')
.its('stdout')
.should('contain', 'Done running the script')
cy.intercept('POST', '/comments').as('postComment')
cy.get('.add-comment').click()
cy.wait('@postComment').then(({ response }) => {
cy.exec(
`echo ${JSON.stringify(response.body)} >cypress/fixtures/comment.json`
)
cy.fixture('comment.json').should('deep.eq', response.body)
})
You can increase the time allowed to execute the command, although we don't recommend executing commands that take a long time to exit.
Cypress will not continue running any other commands until cy.exec() has finished, so a long-running command will drastically slow down your test cycle.
// will fail if script takes longer than 20 seconds to finish
cy.exec('npm run build', { timeout: 20000 })
cy.exec('man bear pig', { failOnNonZeroExit: false }).then((result) => {
expect(result.code).to.eq(1)
expect(result.stderr).to.contain('No manual entry for bear')
})
cy.exec('echo $USERNAME', { env: { USERNAME: 'johndoe' } })
.its('stdout')
.should('contain', 'johndoe')
cy.exec() does not support commands that don't exit, such as:
rails server
A command must exit within the execTimeout or Cypress will kill the command's process and fail the current test.
Cypress.config()
You can change the timeout of cy.exec() for the remainder of the tests by setting the new values for execTimeout within Cypress.config().
Cypress.config('execTimeout', 30000)
Cypress.config('execTimeout') // => 30000
You can configure the cy.exec() timeout within a suite or test by passing the new configuration value within the test configuration.
This will set the timeout throughout the duration of the tests, then return it to the default execTimeout when complete.
describe('has data available from database', { execTimeout: 90000 }, () => {
before(() => {
cy.exec('rake db:seed')
})
// tests
after(() => {
cy.exec('rake db:reset')
})
})
cy.exec() requires being chained off of cy . cy.exec() requires the executed system command to eventually exit. cy.exec() requires that the exit code be 0 when failOnNonZeroExit is true . cy.exec() will only run assertions you have chained once, and will not retry . cy.exec() can time out waiting for the system command to exist. List the contents of the default cypress.json configuration file
if (Cypress.platform === 'win32') {
cy.exec('print cypress.json').its('stderr').should('be.empty')
} else {
cy.exec('cat cypress.json').its('stderr').should('be.empty')
}
The command above will display in the Command Log as:
When clicking on the exec command within the command log, the console outputs the following:
© 2017 Cypress.io
Licensed under the MIT License.
https://docs.cypress.io/api/commands/exec