调试
你将学到
- 如何在 Cypress 测试中使用
debugger
和.debug()
- 如何使用
.pause()
逐步执行测试命令 - 如何使用开发者工具获取命令信息的控制台日志
- Cypress 中错误如何显示和结构化
- 如何调试不稳定的测试
使用 debugger
你的 Cypress 测试代码与应用程序运行在同一个执行循环中。这意味着你可以访问页面上运行的代码,以及浏览器提供给你的功能,如 document
、window
和 debugger
。
像往常一样调试
基于这些特性,你可能会想在测试中插入一个 debugger
,如下所示:
- 端到端测试
- 组件测试
it('let me debug like a fiend', () => {
cy.visit('/my/page/path')
cy.get('[data-testid="selector-in-question"]')
debugger // 不会生效
})
it('let me debug like a fiend', () => {
cy.mount(<MyComponent />)
cy.get('[data-testid="selector-in-question"]')
debugger // 不会生效
})
这可能不会如你预期的那样工作。正如你在 Cypress 简介 中所记得的,cy
命令会将操作排队等待后续执行。你能看出上述测试在这种视角下会做什么吗?
cy.visit()
和 cy.get()
都会立即返回,将它们的工作排队等待后续执行,而 debugger
会在任何命令实际运行之前执行。在使用 cy.mount()
的组件测试中,预期会有相同的行为。
让我们使用 .then()
在命令执行时介入,并在适当的时候添加 debugger
:
- 端到端测试
- 组件测试
it('let me debug when the after the command executes', () => {
cy.visit('/my/page/path')
cy.get('[data-testid="selector-in-question"]').then(($selectedElement) => {
// 在 cy.visit 和 cy.get 命令完成后触发 debugger
debugger
})
})
it('let me debug when the after the command executes', () => {
cy.mount(<MyComponent />)
cy.get('[data-testid="selector-in-question"]').then(($selectedElement) => {
// 在 cy.visit 和 cy.get 命令完成后触发 debugger
debugger
})
})
现在我们可以正常工作了 !当你首次访问页面或挂载组件时(如上所示,使用 cy.get()
链及其附加的 .then()
),命令会被 Cypress 排队执行。it
代码块退出后,Cypress 开始工作:
- 在端到端测试中,页面被访问,Cypress 等待其加载。或者在组件测试中,组件被挂载并渲染。
- 查询元素,如果未立即找到,Cypress 会自动等待并重试几次。
- 传递给
.then()
的函数被执行,并将找到的元素传递给它。 - 在
.then()
函数的上下文中,debugger
被调用,暂停浏览器并将焦点转移到开发者工具。 - 你可以开始了!像平常在应用程序代码中插入
debugger
一样检查应用程序的状态。
使用 .debug()
Cypress 还提供了一个调试命令的快捷方式 .debug()
。让我们用这个辅助方法重写上面的测试:
- 端到端测试
- 组件测试
it('let me debug like a fiend', () => {
cy.visit('/my/page/path')
cy.get('[data-testid="selector-in-question"]').debug()
})
it('let me debug like a fiend', () => {
cy.mount(<MyComponent />)
cy.get('[data-testid="selector-in-question"]').debug()
})
当前由 cy.get()
产生的主题会在你的开发者工具中作为变量 subject
暴露,以便你可以在控制台中与之交互。

使用 .debug()
快速检查测试过程中应用程序的任何(或许多!)部分。你可以将其附加到任何 Cypress 命令链上,以查看系统在该时刻的状态。
逐步执行测试命令
你可以使用 .pause()
命令逐步执行测试命令。
it('adds items', () => {
cy.pause()
cy.get('[data-testid="new-todo"]')
// 更多命令
})
这允许你在每个命令后检查 Web 应用程序、DOM、网络和任何存储,以确保一切按预期进行。
使用开发者工具
尽管 Cypress 已经构建了 一个出色的应用程序 来帮助你理解应用程序和测试中发生的事情,但没有什么可以替代浏览器团队在其内置开发者工具中所做的出色工作。再次,我们看到 Cypress 顺应现代生态系统的潮流,尽可能利用这些工具。