如何在Cypress中重复、循环XHR请求、处理多个XHR请求

如何在Cypress中重复、循环XHR请求、处理多个XHR请求,cypress,Cypress,如何在测试前通过间隔请求? 我尝试了两种方法来重试请求,但都失败了 我需要上传一个文件,等待一个成功导入 在第一步中,我将一个文件上传到cypress中的服务器 before( ()=> { //my custom POST command cy.form_request(url, data) .then(({id}) => { 然后我等待上传文件的id check_It_Till_Success_It(id);

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

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

在第一步中,我将一个文件上传到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\u it\u request”与路由不匹配。

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

  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:Cypress检测到您从一个命令返回了一个承诺,同时还调用了该承诺中的一个或多个cy命令。


我做错了什么?

我发现我的mystake是因为使用了本机JS工具setTimeout、setInterval

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的请求方法崩溃


  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)
        }
      })
  }