Cypress 无法 cy.visit() 因为页面抛出未捕获的异常

ali*_*and 1 javascript uncaught-exception reactjs cypress

这个错误已经让我几个月无法使用 cypress

/// <reference types="cypress" />

describe('User login', () => {
  beforeEach(() => {
    cy.visit('http://localhost:8080')
  })
  // ...
})
Run Code Online (Sandbox Code Playgroud)

我收到一条错误消息:

(uncaught exception)TypeError: Failed to set an indexed property on 'DOMStringList': Indexed property setter is not supported.
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


更多细节:

应用程序规格:

  • 反应16.14.0
  • 反应路由器-dom 4.3.1
  • 反应-redux ^5.0.4"

看来错误是由于某些加载造成的(假设是 webpack) GET 200 /sockjs-node/info?t=1672024046431

我注意到如果我注释掉应用程序的其余部分似乎加载的特定组件(标题栏)

小智 5

当您看到时,(uncaught exception)通常是您的应用程序造成了这种情况。

您无法更改测试代码中的任何内容来实际修复它,这是非常明显的,因为您的测试除了访问页面之外不执行任何操作。

fail您可以通过捕获事件并从处理程序内部返回来让 Cypress 对这个特定错误视而不见false- 这告诉 Cypress 继续执行,就好像错误没有发生一样。

但现在这可能会在以后带来麻烦,因为看起来该步骤是在授权中,如果没有授权,您将无法走得太远。

事件捕获器应该位于规范的顶部,代码如下:

Cypress.once('uncaught:exception', () => false)
Run Code Online (Sandbox Code Playgroud)

如果您发现这就是所需要的,并且之后可以正确测试授权,则永久保留代码,但添加对特定错误消息的检查

Cypress.once('uncaught:exception', (err) => {
  if (err.message.contains('Failed to set an indexed property')) {
    return false
  }
}) 
Run Code Online (Sandbox Code Playgroud)

但如果在此之后您继续收到错误,恐怕您将不得不发布 React 代码才能获得更好的答案。