Skip to main content
Cypress应用

Cypress 错误信息

测试文件错误

未找到测试

此消息表示 Cypress 无法在指定文件中找到测试。如果您有一个空的测试文件且尚未编写任何测试,很可能会看到此消息。

未找到测试

准备测试文件时发现错误

此消息表示 Cypress 在编译和/或打包测试文件时遇到错误。Cypress 会自动编译和打包测试代码,以便您可以使用 ES2015、CoffeeScript、模块等。

通常出现此消息的原因有:

  • 文件不存在
  • 文件或其依赖项中存在语法错误
  • 缺少依赖项

当测试文件中的错误修复后,测试将自动重新运行。

支持文件错误

支持文件缺失或无效

Cypress 在版本 0.18.0 中移除了 supportFolder 选项,改为支持模块和 supportFile 配置选项。

Cypress 过去会在测试文件之前自动包含 supportFolder 中的所有脚本。然而,自动包含特定目录中的所有文件有些神奇且不直观,并且需要为实用函数创建全局变量。

加载配置错误

Cypress 版本 10.0.0 中从根配置对象移除了 supportFile 配置选项。如果您想使用默认 supportFile 配置之外的文件,必须在每个测试类型的配置对象中单独添加此属性。

使用模块实现实用函数

Cypress 支持 ES2015 模块和 CommonJS 模块。您可以导入/要求 npm 模块以及本地模块:

import _ from 'lodash'
import util from './util'

it('uses modules', () => {
expect(_.kebabCase('FooBar')).to.equal('foo-bar')
expect(util.secretCode()).to.equal('1-2-3-4')
})

使用 supportFile 在测试代码之前加载脚本

在测试代码之前加载设置文件仍然很有用。如果您正在设置 Cypress 默认值或使用自定义 Cypress 命令,而不是在每个测试文件中导入/要求这些默认值/命令,可以在每个测试类型的配置对象中使用 supportFile 配置选项。

danger

⚠️ 对于给定的测试类型,多个匹配的 supportFile 文件会导致 Cypress 加载时出错。

与测试文件一样,supportFile 可以使用 ES2015+、TypeScript 或 CoffeeScript 和模块,因此您可以根据需要导入/要求其他文件。

命令错误

Cypress 无法在运行中的测试之外执行命令

无法执行命令

此消息表示您尝试在当前运行的测试之外执行一个或多个 Cypress 命令。Cypress 必须能够将命令关联到特定测试。

通常这是意外发生的,例如以下情况:

describe('Some Tests', () => {
it('is true', () => {
expect(true).to.be.true // 是的,没问题
})

it('is false', () => {
expect(false).to.be.false // 是的,也没问题
})

context('some nested tests', () => {
// 哎呀,您忘记在这里写 it(...) 了!
// 下面的 Cypress 命令
// 在测试之外运行,Cypress
// 会抛出错误
cy.get('h1').should('contain', 'todos')
})
})

将这些 Cypress 命令移动到 it(...) 块中,一切将正常工作。

如果您有意在测试之外编写命令,可能有更好的方法来实现您的目标。阅读 示例 或查看我们的 支持渠道 获取更多故障排除资源。

cy...() 失败,因为页面已更新

出现此错误意味着您尝试与“死”DOM 元素交互——即当前主题已从 DOM 中移除。

cy.method() 失败,因为页面已更新

Cypress 出错是因为在命令之后,主题“固定”到特定元素——由于无法重试命令,如果元素从页面分离,我们无法对其断言或交互。

让我们看下面的示例。

应用程序 HTML

<body>
<div data-testid="parent">
<button>Delete</button>
</div>
</body>

应用程序 JavaScript

$('button').click(function () {
// 当 <button> 被点击时
// 我们从 DOM 中移除按钮,
// 并添加一个新的、相同的按钮。
$(this).replaceWith(this.outerHTML)
})

导致错误的测试代码

cy.get('button').click().parent()

我们已经编程我们的应用程序,使得一旦 click 事件发生,按钮就会从 DOM 中移除。当 Cypress 开始处理上面测试中的下一个查询 (.parent()) 时,它会检测到产生的主题(原始按钮)已从 DOM 分离并抛出错误。

幸运的是,错误信息明确告诉我们该怎么做:

通常可以通过拆分链来解决此问题。

修复后的测试代码

cy.get('button').click()
cy.get('button').parent()

上面的示例是一个简化但具有代表性的例子。在现代 JavaScript 框架中,DOM 元素会定期重新渲染——意味着旧元素被丢弃,新元素取而代之。因为这种情况发生得非常快,对用户来说可能看起来没有任何可见的变化。但如果您正在执行测试命令,可能您正在交互的元素已经“死亡”。要处理这种情况,您必须:

  • 在每条 命令 后始终开始一个新链。
  • 使用 Cypress 查询 来定位页面上的元素,而不是使用特定的 HTML 元素作为主题。

查询(例如 .get().as().parent())和断言(.should().and())可以安全地链式调用。命令(例如 .click())则不行。

cy...() 失败,因为元素无法交互

您可能会看到此消息的四种不同原因:

  1. 元素不可见
  2. 元素被另一个元素覆盖
  3. 元素的中心被隐藏
  4. 元素被禁用

Cypress 运行多个计算以确保元素可以像真实用户一样 实际 交互。如果看到此错误,您可能需要 保护 您的命令(由于时间或动画问题)。

有时 Cypress 无法正确允许您与应该可交互的元素交互。如果是这种情况,请提交问题

如果想覆盖这些内置检查,请为操作本身提供 {force: true} 选项。参考每个命令的可用选项、其他用例和参数用法。

忽略内置错误检查

cy.get('[disabled]').click({force: true}).

使用此选项时要小心。当元素在应用程序中实际上不可交互时,可能会强制测试通过。

cy...() 失败,因为元素当前正在动画

cy.method() 失败,因为元素正在动画

默认情况下,Cypress 检测您尝试交互的元素是否正在动画。此检查确保元素动画不会太快,以至于真实用户无法与之交互。这也防止了一些边缘情况,例如 .type().click() 等操作在过渡期间发生得太快。

Cypress 会持续尝试与元素交互,直到最终超时。如果想强制 Cypress 与元素交互,有几个选项:

  • 传递 {force: true}。这会禁用 所有 错误检查。
  • 传递 {waitForAnimations: false} 以禁用动画错误检查。
  • 传递 {animationDistanceThreshold: 20} 以降低检测元素是否动画的灵敏度。通过增加阈值,可以让元素在页面上移动更远而不会导致 Cypress 持续重试。
cy.get('[data-testid="modal-close"]').click({ waitForAnimations: false })

可以通过修改 Cypress 配置 全局禁用动画错误检查或增加阈值。

Cypress 配置文件

const { defineConfig } = require('cypress')

module.exports = defineConfig({
waitForAnimations: false,
animationDistanceThreshold: 50,
})

测试已完成,但 Cypress 仍有命令在其队列中

让我们看看几种可能导致此错误消息的不同情况。在每种情况下,您都需要更改测试代码以防止错误。

测试已完成,但 Cypress 仍有命令
caution
下面的测试不稳定!

其中一些测试依赖于竞态条件。您可能需要多次运行这些测试才能使其失败。也可以尝试调整一些延迟。

简短示例

下面的第一个测试将通过,并显示 Cypress 尝试防止在每个测试中在队列中留下命令。

即使我们在测试中返回一个字符串,Cypress 也会自动发现您在上面排队了命令,并且在所有 cy 命令完成之前不会结束测试。

// 此测试通过!
it('Cypress 很聪明,这不会失败', () => {
cy.get('body').children().should('not.contain', 'foo') // <- 这里没有返回

return 'foobarbaz' // <- 这里返回
})

下面的示例将失败,因为您使用 mocha 的 done 强制提前终止了测试。

// 此测试出错!
it('但您可以强制提前结束测试,这会失败', (done) => {
cy.get('body')
.then(() => {
done() // 强制结束测试,尽管下面还有命令
})
.children()
.should('not.contain', 'foo')
})

复杂异步示例

在这个示例中,因为我们 没有 告诉 Mocha 这是一个异步测试,这个测试会 立即 通过然后移动到下一个测试。然后,当 setTimeout 回调函数运行时,新命令会在错误的测试中排队。Cypress 会检测到这一点并使 下一个 测试失败。

describe('带有异步代码的复杂示例', function () {
it('可能导致命令渗入下一个测试', function () {
// 此测试通过...但是...
setTimeout(() => {
cy.get('body').children().should('not.contain', 'foo')
}, 10)
})

it('由于之前编写不当的测试,此测试将失败', () => {
// 此测试出错!
cy.wait(10)
})
})

正确编写上述测试代码的方法是使用 Mocha 的 done 表示它是异步的。

it('不会导致命令渗入下一个测试', (done) => {
setTimeout(() => {
cy.get('body')
.children()
.should('not.contain', 'foo')
.then(() => {
done()
})
}, 10)
})

复杂 Promise 示例

在下面的示例中,我们忘记在测试中返回 Promise。这意味着测试同步通过,但我们的 Promise 在下一个测试中解析。这也会导致命令在错误的测试中排队。我们将在下一个测试中收到 Cypress 检测到其命令队列中有命令的错误。

describe('另一个使用忘记“return”的复杂示例', () => {
it('忘记返回 promise', () => {
// 此测试通过...但是...
Cypress.Promise.delay(10).then(() => {
cy.get('body').children().should('not.contain', 'foo')
})
})

it('由于之前编写不当的测试,此测试将失败', () => {
// 此测试出错!
cy.wait(10)
})
})

正确编写上述测试代码的方法是返回我们的 Promise

it('不会忘记返回 promise', () => {
return Cypress.Promise.delay(10).then(() => {
return cy.get('body').children().should('not.contain', 'foo')
})
})

cy.visit() 失败,因为您尝试访问第二个唯一域

caution
注意

此错误仅适用于 Cypress 版本 v11.0.0 及以下。从 Cypress v12.0.0 开始,用户可以在单个测试中导航到多个域。

请参阅我们的 跨源测试 文档。

cy.visit() 失败,因为您尝试访问不同的源域

caution
注意

此错误仅适用于 Cypress 版本 v11.0.0 及以下。从 Cypress v12.0.0 开始,用户可以在单个测试中导航到多个域。

如果两个 URL 的 protocolport(如果指定)和 host 相同,则它们具有相同的源。您只能在单个测试中访问同源的域。您可以在此处阅读有关同源策略的更多信息 here

您可以在不同测试中访问不同源的 URL,因此您可能考虑将对不同源域的 cy.visit() 拆分为单独的测试。

请参阅我们的 跨源测试 文档以获取更多信息和解决方法。

cy.visit() 成功,但命令超时

从 Cypress v12.0.0 开始,用户可以在单个测试中导航到多个域。以下测试将按原样成功:

it('导航到 docs.cypress.io', () => {
cy.visit('http://localhost:3000')
cy.visit('https://docs.cypress.io') // 访问不同的域
})

但是,当新访问的 URL 不被视为同一域时,必须使用 cy.origin() 命令与新访问的域交互。以下测试不正确:

it('导航到 docs.cypress.io 并运行其他命令', () => {
cy.visit('http://localhost:3000')
cy.visit('https://docs.cypress.io') // 访问不同的域
cy.get('h1').should('contain', 'Why Cypress?') // 失败
})

并将导致以下错误:

cy.visit() 后续命令超时

要修复此问题,我们的 cy.get() 命令 必须cy.origin() 命令包装,如下所示:

it('导航到 docs.cypress.io 并运行其他命令', () => {
cy.visit('http://localhost:3000')
cy.visit('https://docs.cypress.io') // 访问不同的域
cy.origin('https://docs.cypress.io', () => {
cy.get('h1').should('contain', 'Why Cypress?') // 现在成功!
})
})

请参阅我们的 跨源测试 文档以获取更多信息和解决方法。

Cypress.addParentCommand() / Cypress.addDualCommand() / Cypress.addChildCommand() 已被移除,替换为 Cypress.Commands.add()

在版本 0.20.0 中,我们移除了添加自定义命令的命令,并用我们认为是更简单的接口替换了它们。

现在您可以使用相同的 Cypress.Commands.add() 命令创建父命令、双命令和子命令。

请阅读我们的 编写自定义命令的新文档

Cypress 检测到您在自定义命令中调用了一个或多个 cy 命令,但返回了不同的值。

因为 cy 命令是异步的,并且稍后排队运行,所以返回其他任何内容都没有意义。

为了方便,您也可以省略任何返回值或返回 undefined,Cypress 不会出错。

在 Cypress 的 0.20.0 之前的版本中,我们自动检测到这一点并强制返回 cy 命令。为了使事情不那么神奇和更清晰,我们现在抛出一个错误。

Cypress 检测到您调用了一个或多个 cy 命令,但返回了不同的值。

因为 cy 命令是异步的,并且稍后排队运行,所以返回其他任何内容都没有意义。

为了方便,您也可以省略任何返回值或返回 undefined,Cypress 不会出错。

在 Cypress 的 0.20.0 之前的版本中,我们自动检测到这一点并强制返回 cy 命令。为了使事情不那么神奇和更清晰,我们现在抛出一个错误。

Cypress 检测到您从命令中返回了一个 promise,同时在该 promise 中调用了一个或多个 cy 命令。

因为 Cypress 命令已经是类似 promise 的,您不需要包装它们或返回自己的 promise。

Cypress 将用最终的 Cypress 命令产生的任何内容解析您的命令。

此错误而不是警告的原因是 Cypress 内部将命令串行排队,而 Promise 在调用时立即执行。尝试协调这一点会阻止 Cypress 解析。

Cypress 检测到您在测试中返回了一个 promise,但在该 promise 中调用了一个或多个 cy 命令。

虽然这在实践中有效,但这通常是一种反模式。您几乎不需要同时返回 promise 和调用 cy 命令。

cy 命令本身已经是类似 promise 的,您可以避免使用单独的 Promise。

Cypress 检测到您在测试中返回了一个 promise,但也调用了 done 回调。

Mocha 的版本随 Cypress 4.0 升级。Mocha 3+ 不再允许返回 promise 并调用 done 回调。在 4.0 迁移指南 中阅读更多信息。

CypressError: 重试超时:期望找到元素:‘…’,但从未找到。从元素查询:<…>

如果在 DOM 中元素确实可见的情况下出现此错误,您的文档可能包含格式错误的 HTML。在这种情况下,document.querySelector() 不会找到出现在 HTML 格式错误点之后的任何元素。即使您确信您的 HTML 在任何地方都没有格式错误,也要检查它(在开发工具中逐行检查)。特别是如果您已经排除了所有其他可能性。

CLI 错误

本节中的错误可能在使用 Cypress 命令行 (CLI) 时发生。它们也可能适用于通过 Cypress 模块 API 以编程方式运行 Cypress。

您传递了 --record 标志,但没有提供记录密钥。

在尝试在 持续集成 中运行 Cypress 测试时,您可能会看到此错误。这意味着您没有将特定的记录密钥传递给:cypress run --record

由于没有传递记录密钥,Cypress 检查任何名为 CYPRESS_RECORD_KEY 的环境变量。在这种情况下,也没有找到。

您可以通过在 Cypress 应用程序的设置选项卡或 Cypress Cloud 中找到项目的记录密钥。

然后您会想要 将密钥添加到您的配置文件或作为环境变量

cypress ci 命令已被弃用

从版本 0.19.0 和 CLI 版本 0.13.0 开始,cypress ci 命令已被弃用。我们这样做是为了更清楚地说明 常规测试运行记录的测试运行 之间的区别。

以前要记录运行,您有环境变量:CYPRESS_CI_KEY 或您编写了:

cypress ci abc-key-123

您需要将其重写为:

cypress run --record --key abc-key-123

如果您使用的是环境变量 CYPRESS_CI_KEY,请将其重命名为 CYPRESS_RECORD_KEY

您现在可以运行并省略 --key 标志:

cypress run --record

我们将自动应用记录密钥环境变量。

找不到缓存的 Cypress 二进制文件

此错误在 CI 中尝试使用 cypress runcypress verify CLI 命令时发生,而系统上没有安装有效的 Cypress 二进制缓存。

Cypress 二进制文件通过包管理器安装命令(如 npm cinpm installyarn installpnpm install)下载并安装到 全局缓存文件夹。Cypress 缓存也可以从之前 CI 运行保存的 CI 缓存中加载。

如果您使用 pnpm,请确保遵循 pnpm 配置 说明,否则 pnpm 可能会跳过 Cypress 二进制安装。

如果您使用 CI 缓存,请同时查看 在 CI 中缓存 Cypress 二进制文件 的建议。

--ci-build-id 标志使用不正确

您传递了 --ci-build-id 标志,但没有提供 --group--parallel 标志。

--ci-build-id 标志用于将多个运行分组或并行化。

查看我们的 并行化运行指南 以及何时使用 --ci-build-id 选项。

--ci-build-id--group--tag--parallel--auto-cancel-after-failures 标志只能在记录时使用

您传递了 --ci-build-id--group--tag--parallel--auto-cancel-after-failures 标志,但没有传递 --record 标志。

这些标志只能在记录到 Cypress Cloud 时使用。

请查看我们的 并行化 文档以了解更多信息。

我们无法确定唯一的 CI 构建 ID

您传递了 --group--parallel 标志,但我们无法自动确定或生成 ciBuildId

要使用这些参数中的任何一个,必须确定 ciBuildId

如果您在大多数 CI 提供程序 中运行 Cypress,ciBuildId 会自动检测。请查看您的 CI 提供程序的 本地识别的环境变量

您可以通过手动将 ID 传递给 --ci-build-id 标志来避免将来的此检查。

请查看我们的 并行化 文档以了解更多信息。

此运行的组名已被使用

您传递了 --group 标志,但此组名已用于此运行。

如果您尝试并行化此运行,则还应传递 --parallel 标志,否则传递不同的组名。

请查看 分组测试运行 文档以了解更多信息。

无法跨环境并行化测试

您传递了 --parallel 标志,但我们不会跨不同环境并行化测试。

此机器发送的环境参数与启动此并行运行的第一个机器不同。

要以并行模式运行,每台机器必须发送相同的环境参数,例如:

  • 规范
  • 操作系统名称
  • 操作系统版本
  • 浏览器名称
  • 主要浏览器版本

请查看我们的 并行化 文档以了解更多信息。

无法在此组中并行化测试

您传递了 --parallel 标志,但此运行组最初是在没有 --parallel 标志的情况下创建的。

您不能在此组中使用 --parallel 标志。

请查看我们的 分组测试运行 文档以了解更多信息。

运行必须传递 --parallel 标志

您没有传递 --parallel 标志,但此运行的组最初是用 --parallel 标志创建的。

您必须在此组中使用 --parallel 标志。

请查看我们的 并行化 文档以了解更多信息。

无法在过期的运行上并行化测试

当您尝试将 --parallel 标志传递给 Cypress 检测到超过 24 小时前完成的运行时,会抛出此错误。

为了在 cypress run 期间唯一标识每个运行,Cypress 尝试从您的 CI 提供程序读取唯一标识符,如我们的 并行化文档 中所述。

如果 Cypress 检测到与之前 CI 构建 ID 完全相同的 CI 构建 ID 匹配超过 24 小时前完成的运行中的 CI 构建 ID,您可能会遇到此错误。您无法在已完成这么长时间的运行上运行测试。​ ​您可以通过查看 Cypress Cloud 中运行顶部的详细信息部分来查看每个已完成运行的 CI 构建 ID。​ ​您可以按照 此处 所述为每次运行生成并传递自己的唯一 CI 构建 ID。

还请查看我们的 并行化 文档以了解更多信息。

运行不接受任何新组

您尝试访问的运行已完成,不会接受新组。

当运行完成其所有组时,它会等待可配置的时间 运行完成延迟,然后完成。所有带有任何新组的 cypress run 调用必须在此期间执行。

故障排除

  • 如果您传递 --ci-build-id,请确保它为运行生成唯一值。如果不唯一且与之前的运行匹配,您可能会看到此错误。
  • 如果您并行运行 cypress run 调用,并且它们在默认的 60 秒运行完成延迟内未完成,可以增加此延迟。查看说明

请查看我们的 并行化 文档以了解更多信息。

无法解压 Cypress 应用程序。这很可能是因为您的系统上超过了最大路径长度。

安装 Cypress 时,它会解压到您计算机上的指定缓存位置。此错误意味着 Cypress 检测到在解压 Cypress 时超过了最大路径长度。

这在 Windows 上很常见,过去最大路径长度为 260 个字符。

要修复此错误,请在 Windows 系统上启用“长路径”:

  1. 转到开始菜单,右键单击 PowerShell。选择“以管理员身份运行”。
  2. 运行此命令:
New-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" `
-Name "LongPathsEnabled" -Value 1 -PropertyType DWORD -Force
  1. 重新启动计算机。

这应该可以消除错误。如果仍然收到此错误,请 搜索开放问题提交新问题

如果没有可用的 Powershell,也可以通过 regedit 或 gpedit 进行此更改。请参阅 Microsoft 的文档以获取详细信息。

错误:未知选项:--auto-cancel-after-failures

--auto-cancel-after-failures 标志仅在 Cypress 12.6.0 及更高版本中可用,并且必须与 cypress run 命令一起使用。

--auto-cancel-after-failures 必须是整数或 false

您为 --auto-cancel-after-failures 标志传递了无效值。它必须是整数或 false。

--auto-cancel-after-failures 传递了非商业或企业云账户

自动取消不包括在您当前的计费计划中。要启用此服务,请访问您的计费并升级到具有自动取消的其他计划。

https://www.cypress.io/pricing/

您为已在进行中的运行传递了 --auto-cancel-after-failures 标志

您传递了 --auto-cancel-after-failures 标志,但此运行最初是用此 --auto-cancel-after-failures 标志的不同值启动的。

任何给定运行的 --auto-cancel-after-failures 的第一个设置优先。

页面加载错误

Cypress 检测到页面加载时发生跨源错误

info

有关 Cypress 跨源测试的更详细说明,请阅读我们的专用指南

此错误意味着您的应用程序导航到了 Cypress 未绑定的超域。最初当您 cy.visit() 时,Cypress 会将浏览器的 URL 更改为与传递给 cy.visit()url 匹配。这使 Cypress 能够与您的应用程序通信以绕过所有同源安全策略等。

当您的应用程序导航到当前源策略之外的超域时,Cypress 无法与之通信,因此失败。

这些常见情况有一些解决方法:

  1. 不要在测试中点击导航到应用程序外部的 <a> 链接。可能这不值得测试。您应该问自己:点击并转到另一个应用程序有什么意义? 可能您只关心 href 属性是否符合预期。因此对此进行断言。您可以在我们的“标签处理和链接”示例配方中查看更多测试锚链接的策略 in our "Tab Handling and Links" example recipe

  2. 您正在测试使用单点登录 (SSO) 的页面。在这种情况下,您的 Web 服务器可能在超域之间重定向您,因此您会收到此错误消息。您可以通过使用 cy.request() 手动处理会话来绕过此重定向问题。

如果发现自己无法解决这些问题,可以在 Cypress 配置 中将 chromeWebSecurity 设置为 false 在 Chrome 系列浏览器中运行(此设置在其他浏览器中不起作用)。在这样做之前,您应该真正理解并 阅读此处的推理

const { defineConfig } = require('cypress')

module.exports = defineConfig({
chromeWebSecurity: false,
})

Cypress 检测到从跨源脚本抛出了未捕获的错误。

检查您的开发者工具控制台以获取实际错误 - 它应该打印在那里。

可以通过添加 crossorigin 属性并设置 CORS 头来启用调试这些脚本。

浏览器错误

运行测试的浏览器进程意外退出

每当 Cypress 检测到启动的浏览器在测试完成运行之前退出或崩溃时,都会发生此错误。

这可能由于多种原因发生,包括:

  • 浏览器通过点击“退出”按钮或其他方式手动退出。
  • 您的测试套件或被测应用程序正在耗尽浏览器的资源。
  • Cypress 在内存不足的环境中运行。
  • 浏览器正在测试内存密集型应用程序。
  • GPU/GPU 驱动程序存在问题。
  • 浏览器中存在涉及内存管理的错误。
  • Cypress 中存在内存泄漏。

对于基于 Chromium 的浏览器,您可以尝试启用 experimentalMemoryManagement

如果在 open 模式下运行,也可以尝试降低 numTestsKeptInMemory

如果运行 Cypress 测试的浏览器崩溃,Cypress 将中止任何剩余的测试并打印此错误。

Cypress 应用程序错误

哎呀,我们无法运行您的测试

当 Cypress 检测到浏览器自动化未连接,或 Cypress 的内部代理被绕过时,会发生此错误。这是由于以下原因之一引起的:

策略设置阻止了 Cypress 代理服务器或浏览器扩展

您在非 Cypress 浏览器中访问了 Cypress 代理 URL。

  • 不要复制从 Cypress 应用程序启动 Cypress 浏览器时看到的 URL 并在非 Cypress 浏览器中打开它。如果想在不同的浏览器中运行测试,请按照 跨浏览器测试 指南中的说明操作。

无法连接到 API 服务器

登录、查看运行和设置新项目以记录需要连接到外部 API 服务器。当我们无法连接到 API 服务器时,会显示此错误。

此错误可能出现是因为:

  1. 您没有互联网。请确保您有连接,然后重试。
  2. 您是一个开发人员,已分叉我们的代码库,并且无权在本地运行我们的 API。请在我们的 贡献文档 中阅读更多信息。

Cypress 检测到计算机上的策略设置可能导致问题

当 Cypress 启动 Chrome 时,它会尝试使用自定义代理服务器和浏览器扩展启动它。Windows 上的某些组策略 (GPO) 可以防止此操作按预期工作,从而导致测试中断。

如果您的管理员设置了以下任何 Chrome GPO,可能会阻止您在 Chrome 中运行测试:

  • 代理策略: ProxySettings, ProxyMode, ProxyServerMode, ProxyServer, ProxyPacUrl, ProxyBypassList
  • 扩展策略: ExtensionInstallBlacklist, ExtensionInstallWhitelist, ExtensionInstallForcelist, ExtensionInstallSources, ExtensionAllowedTypes, ExtensionAllowInsecureUpdates, ExtensionSettings, UninstallBlacklistedExtensions

以下是一些潜在的解决方法:

  1. 请您的管理员禁用这些策略,以便您可以使用 Chrome 的 Cypress。
  2. 使用内置的 Electron 浏览器进行测试,因为它不受这些策略的影响。有关启动浏览器的更多信息,请参阅指南。
  3. 尝试使用 Chromium 而不是 Google Chrome 进行测试,因为它可能不受 GPO 影响。您可以 在此处下载最新的 Chromium 构建
  4. 如果您对计算机具有本地管理员访问权限,可以删除影响 Chrome 的注册表项。以下是一些说明:
    1. 按 WinKey+R 并键入 regedit.exe 打开注册表编辑器。
    2. 在以下位置查找上述策略设置:
      • HKEY_LOCAL_MACHINE\Software\Policies\Google\Chrome
      • HKEY_LOCAL_MACHINE\Software\Policies\Google\Chromium
      • HKEY_CURRENT_USER\Software\Policies\Google\Chrome
      • HKEY_CURRENT_USER\Software\Policies\Google\Chromium
    3. 删除或重命名找到的任何策略键。在更改之前确保备份注册表。

来自应用程序的未捕获异常

当 Cypress 在您的应用程序中检测到未捕获的异常时,它将使当前运行的测试失败。

您可以使用 uncaught:exception 事件全局或有条件地关闭此行为。请参阅 事件目录 中的示例。

从技术上讲,Cypress 认为未捕获的异常是您的应用程序未捕获的任何错误,无论是“标准”错误还是未处理的 promise 拒绝。如果错误触发了窗口的全局 error 处理程序或其 unhandledrejection 处理程序,Cypress 将检测到它并使测试失败。