首页 > 解决方案 > 赛普拉斯测试 AJAX 请求之一的 500 服务器错误

问题描述

我在基于 Drupal 8 的网站上使用 Cypress 测试时遇到问题,当单击调用 AJAX 命令的按钮之一时出现 500 服务器错误,当我浏览同一页面时它工作得很好在本地,但赛普拉斯立即抛出 500 服务器错误。

正如@NoriSte 所描述,我已经使用https://www.npmjs.com/package/cypress-wait-until cy.waitUntil尝试了以下代码并更新了选择器等,该代码正在尝试/单击按钮多次但在所有请求中,AJAX 都获得了 500。

500 服务器错误

    // This will be set to true when the XHR request starts.
    let requestStarted = false
    cy.server()
    cy.route({
      method: 'POST',
      url: '/the-ajax-url?*',
      onRequest: () => (requestStarted = true)
    }).as('sendCommand');

    cy.get('.the-button-selector').as('button')

    cy.waitUntil(() => cy.get('@button')
      .should('be.visible')
      .click({force: true})
      .then(() => requestStarted === true), {
      timeout: 20000,
      interval: 1000,
      errorMsg: 'POST not sent `enter code here` within time limit'
    })

    cy.wait('@sendCommand')

在此处输入图像描述

我想要实现的是允许这个 AJAX 请求一段时间,所以它不会快速抛出 500 错误,而是按预期加载和工作。

注意:这个 AJAX 请求响应实际上大约是 ~1.5 MB,不确定这是否会有所帮助。

标签: ajaxdrupalcypresswait

解决方案


日志似乎表明了两件事

  1. 路由未捕获 url(因为错误消息是这样说的)

    • 建议使用Cypress.minimatch进行测试,也许简化为url: '/the-ajax-url'
    • 路由应该指定status: 201,否则一旦 url 匹配,它似乎可能会捕获 500 状态并将 requestStarted 设置为 true,这不是您想要的。
  2. cy.waitUntil()不等待,因为requestStarted === true不可能是真的,因为路线没有捕获。

    • 查看此作为重试cypress xhr request retry ontimeout的替代方法。cy.waitUntil()在幕后使用递归,但并不完全清楚该until部分是如何工作的。使用更简单的递归函数将使您更加清晰。

推荐阅读