首页 > 解决方案 > 带有 cy.request 的赛普拉斯登录命令导致后续 cy.visit 失败

问题描述

我正在尝试在每次测试之前使用赛普拉斯进行编程登录。我的令牌保存在 localStorage 中。如果我同步更改它,即简单localStorage.setItem地不涉及cy.request它就可以正常工作。但是,我想使用我的身份验证服务器(http://localhost:3004/login如下)来生成令牌。

令牌是从服务器正确获取的,但是一旦我使用下面的命令以及cy.visit('/')我得到“无法访问 localhost:8080 - 我们试图向这个 URL 发出 http 请求,但请求失败而没有响应”(见完整的日志如下)。

据我所知,这是使用身份验证服务器进行无头身份验证时的正确方法。我错过了什么?

命令.js

Cypress.Commands.add('login', () => {
  cy.request({
    method: 'POST',
    url: `http://localhost:3004/login`,
    body: {
      username: 'foo@bar.com',
      password: '123'
    }
  }).its('body').then((body) => {
    const vuexData = { user: { authenticationData: { token: body.token } } }
    window.localStorage.setItem('vuex', JSON.stringify(vuexData))
  })
})

测试.js

describe('A test', () => {
  beforeEach(() => {
    cy.login()
  })

  it('works', () => {
    cy.visit('/')
    cy.get('h1').contains('All Books')
  })
})

CypressError:cy.visit() 尝试加载失败:

http://localhost:8080/

我们尝试向此 URL 发出 http 请求,但请求失败且没有响应。

我们在网络级别收到此错误:

错误:连接 ECONNREFUSED ::1:8080

失败的常见情况: - 您无法访问互联网 - 您忘记运行/启动您的 Web 服务器 - 您的 Web 服务器无法访问 - 您的计算机上有奇怪的网络配置设置

此错误的堆栈跟踪是:

错误:在 TCPConnectWrap.afterConnect [as oncomplete] 处连接 ECONNREFUSED ::1:8080 (net.js:1056:14)

标签: javascriptautomated-testscypress

解决方案


好的,这里有几个错误。

  1. 替换cy.route()cy.intercept(),因为较早的版本最近已被弃用并替换为较晚的版本。
  2. 检查使用的正确语法,cy.intercept()因为它与cy.route()
  3. 我假设您正在尝试绕过某种身份验证。如果您的应用程序需要考虑用户“经过身份验证”是在本地存储上拥有这些信息,那么您甚至不需要执行 POST 请求,但是,如果您这样做,那么:
  4. 检查cy.intercept()用于处理(和存根)与您的 XHR 请求相关的请求和响应对象的用法。
  5. 要在 Cypress 窗口上设置本地存储,您需要使用该cy.window()命令。

推荐阅读