如何在赛普拉斯中重复,圈出XHR请求,处理多个XHR请求

时间:2020-02-21 09:37:30

标签: cypress

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

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

第一步,我将文件上传到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 个答案:

答案 0 :(得分:1)

我发现了我的错误,因为使用了本地JS工具作为 setTimeout setInterval

Cypress不允许使用它们,并以可控制的方法代替: cy.clock cy.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)
        }
      })
  }

离题注释 :我是赛普拉斯的新手,据我了解,它取代了大多数js原生功能,因此需要使文档更近一些(BINGO !)或查看issue section,因为某些JS特定功能只是使Cypress 崩溃而没有任何通知或捕获的错误,例如:FormData对象使Cypress的request方法崩溃。