如何在测试前通过间隔请求? 我尝试了两种重试请求的方法,但都失败了;

我需要上传一个文件,等待一个成功导入

第一步,我将文件上传到我在 cypress 中的服务器

    before( ()=> {
      //my custom POST command
      cy.form_request(url, data)
        .then(({id}) => {

然后我等待上传文件的 id

          check_It_Till_Success_It(id);
        })
    })

然后将接收到的 id 传递到一个新的请求中以验证其在服务器上的状态,并且需要重复该请求直到文件处理完成。 在下面的解决方案中,它说

CypressError: cy.wait() 只接受路由的别名。 别名:'check_it_request' 与路由不匹配。

  function check_It_Till_Success_It(id) {

    function checkRequest() {
      cy.request("GET", "http://localhost:28080/admin/api/catalog/import/status/" + id)
        .then(({status}) => {
          if (status === "FINISHED" || status === "FAILED") {
            clearInterval(check_It);
          } else {
            console.log('retry one more time');
          }
        }).as('check_it_request');
      cy.wait("@check_it_request");
    }

    checkRequest();

    const check_It =  setInterval(checkRequest, 1000);
  }

或者这是我通过递归请求的另一个解决方案:

  function check_It_Till_Success_It(id) {

    return (
      cy.request("GET", BASE_URL + "/admin/api/catalog/import/status/" + id)
        .then(({status}) => {
          if (status === "FINISHED" || status === "FAILED") {
            console.log('success');
          } else {
            console.log('retry one more time');
            setTimeout(() => check_It_Till_Success_It(id), 1000)
          }
        })
    )
  }

但它抛出一个错误:

未捕获的 CypressError:赛普拉斯检测到您从命令返回了一个承诺,同时还调用了该承诺中的一个或多个 cy 命令。

我究竟做错了什么?

#1楼 票数:2

我发现了我的秘密,因为使用了原生 JS 工具作为setTimeoutsetInterval

Cypress 不允许使用它们并替换为可控方法: cy.clockcy.tick

所以我采用了递归实现并替换为上面的方法,我的代码变成了:


  function check_It_Till_Success_It(id) {
    cy.request("GET", BASE_URL + "/admin/api/catalog/import/status/" + id)
      .then(resp => {
        const status = resp.body.status;

        if (status === "FINISHED" || status === "FAILED") {
          console.log('success');

        } else {
          console.log('retry one more time');
          cy.clock();
          cy.tick(1000);
          check_It_Till_Success_It(id)
        }
      })
  }

题外笔记:我是 Cypress 的新手,据我所知,它取代了大部分 js 原生功能,因此需要更仔细地查看文档(宾果游戏!)或查看问题部分,因为某些 JS 特定功能只会使 Cypress 崩溃而没有任何功能通知或捕获的错误,例如:FormData 对象崩溃了 Cypress 的请求方法。

  ask by Alexey Nikonov translate from so

未解决问题?本站智能推荐:

3回复

如何在 Cypress 中等待两个并行的 XHR 请求

我知道这是可能等待在同一网址多个XHR请求如图所示这里。 但是,我想等待两个并行运行的请求。 当我如上所示添加两个等待时,第二个等待有时会在它们非常接近地完成时超时,因为它基本上错过了 XHR。 我不喜欢片状的介绍。 有没有更好的方法来写这个我想念的?
1回复

如何让 Cypress 等待不确定数量的 XHR 请求

在我的 React 应用程序中,当用户登录时,他们会被重定向到仪表板。 然后,应用程序向“/files”端点发送请求,该端点返回静态文件的路径,然后应该通过单独的请求(如GET https://api_address/static_file/xxx这些文件的问题是,该数字永远不是相同的。 有时是 1
4回复

Cypress - 为所有 XHR 请求添加自定义标头

我注意到X-CSRFToken标头在测试之间被删除,对于从被测应用程序触发的所有 XHR 请求。 我不确定要保留这个标头,因为我已经通过Cypress.Cookies.preserveOnce('sessionid', 'csrftoken')保留了 Cookies 因此,我想到将自定义标头X-C
2回复

Cypress.io - 断言没有对 URL 的 XHR 请求?

使用 cypress.io 进行测试时,是否有一种好方法可以断言没有对给定 URL 发出 XHR 请求? 我想断言在单击“保存”按钮时添加了一个新的 foo,而不是在单击“取消”按钮时添加。 像这样的东西: 我已经尝试使用执行 assert.fail 的 onRequest 回调来设置 cy
1回复

通过Cypress.io捕获所有XHR请求

当我调用URL时,发送的请求数量不确定。 现在,我尝试找出其中一个请求是否包含某个有效负载。 我在如何捕获赛普拉斯中的所有API调用上找到了类似的方法? 至今。 这里的问题是假定了固定数量的API调用。 如果没有包含有效负载的单个请求,我如何才能截获所有请求并使我的测试
1回复

如果在 Cypress docker 容器中运行,Cypress 会中止 XHR 请求

我正在使用 cy.route() 进行测试。 这是它在调试中的样子: 在我的本地环境中,所有测试都运行正常,但在 gitlab ci 上,我收到了一些请求中止。 我使用 Cypress docker 图像,也尝试过 npm docker 图像。 是否有解决此问题的方法? 看起来问题在
1回复

赛普拉斯XHR存根忽略了使用fetch执行的ajax请求

重要信息 这里最初的问题不是直接关于赛普拉斯缺乏对fetch api的支持,但这是我最初在这里发布的问题的原因。 我编辑了问题的标题,并在此处添加了这个序言。 本段下面是问题的原始内容: 原始问题 赛普拉斯的文档中充满了一些示例,您可以在其中设置特定Web请求的别名,然后您
3回复

等待对同一 url 或端点的多个 XHR 请求

在 Cypress 中,我有多个请求与我的cy.route()声明相匹配。 我想确保在路线上提出了不止一个请求。 我如何告诉 Cypress 等待对同一 url 的多个 XHR 请求?