exec
执行系统命令。
caution
反模式
不要尝试通过 cy.exec()
启动 web 服务器。
阅读关于最佳实践的内容。
语法
cy.exec(command)
cy.exec(command, options)
用法
正确用法
cy.exec('npm run build')
参数
command (String)
从项目根目录(包含 Cypress 配置文件的目录)执行的系统命令。
options (Object)
传入选项对象以改变 cy.exec()
的默认行为。
选项 | 默认值 | 描述 |
---|---|---|
log | true | 在 命令日志 中显示命令 |
env | {} | 执行命令前设置的环境变量对象(例如 {USERNAME: 'johndoe'} )。将与现有系统环境变量合并 |
failOnNonZeroExit | true | 如果命令以非零代码退出是否失败 |
timeout | execTimeout | 等待 cy.exec() 解析的超时时间 超时 |
生成结果
cy.exec()
返回一个包含以下属性的对象:
code
stdout
stderr
示例
命令
cy.exec()
提供了执行任意系统命令的逃生舱口,因此你可以在 Cypress 范围之外执行测试所需的操作。这适用于:
- 运行构建脚本
- 初始化测试数据库
- 启动进程
- 终止进程
运行构建命令
cy.exec('npm run build').then((result) => {
// 返回 'result' 对象
// {
// code: 0,
// stdout: "文件构建成功",
// stderr: ""
// }
})
初始化数据库并断言成功
cy.exec('rake db:seed').its('code').should('eq', 0)
运行任意脚本并断言输出
cy.exec('npm run my-script')
.its('stdout')
.should('contain', '脚本运行完成')
写入文件以从响应体创建 fixture
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)
})
选项
修改超时时间
你可以增加执行命令的允许时间,尽管 我们不建议执行需要很长时间才能退出的命令。
Cypress 不会 继续运行任何其他命令,直到 cy.exec()
完成,因此长时间运行的命令会显著减慢测试周期。
// 如果脚本执行超过 20 秒将失败
cy.exec('npm run build', { timeout: 20000 })
选择在非零退出时不失败并断 言 code 和 stderr
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()
不支持不退出的命令,例如:
- 启动
rails server
- 运行监视的任务
- 任何需要手动中断才能停止的进程
命令必须在 execTimeout
内退出,否则 Cypress 将终止命令进程并使当前测试失败。
通过 Cypress.config()
重置超时
你可以通过 Cypress.config() 设置 execTimeout
的新值来更改剩余测试的 cy.exec()
超时时间。
Cypress.config('execTimeout', 30000)
Cypress.config('execTimeout') // => 30000
在测试配置中设置超时
你可以在套件或测试中通过 测试配置 传递新的配置值来配置 cy.exec()
的超时时间。
这将在测试期间设置超时时间,完成后将其恢复为默认的 execTimeout
。
describe('has data available from database', { execTimeout: 90000 }, () => {
before(() => {
cy.exec('rake db:seed')
})
// 测试
after(() => {
cy.exec('rake db:reset')
})
})
规则
要求
cy.exec()
需要链式调用cy
。cy.exec()
需要执行的系统命令最终退出。cy.exec()
要求当failOnNonZeroExit
为true
时退出代码为0
。
断言
cy.exec()
只会运行一次你链式调用的断言,不会 重试。
超时设置
cy.exec()
可能会因等待系统命令退出而超时。
命令日志
列出 package.json 文件的内容
if (Cypress.platform === 'win32') {
cy.exec('type package.json').its('stderr').should('be.empty')
} else {
cy.exec('cat package.json').its('stderr').should('be.empty')
}
上述命令将在命令日志中显示为:

当点击命令日志中的 exec
命令时,控制台输出如下:
