如何重复请求直到在 Cypress 中得到不同的响应

How to repeat a request until getting a different response in Cypress

我正在处理链式请求,需要等到满足条件才能测试响应。之前的请求总是 return 一个响应,但我需要它的状态是“完成”,有时它是“进行中”。我不想对此 cy.wait() 使用静态等待,因为这要么使测试不稳定,要么永远持续下去。我能怎么做? 到目前为止,这是我的代码,但它卡住了并且永远不会完成。使用静态等待(无循环)效果很好。

有什么想法吗?

it('name of the test', function() {
  cy.processFile().then((response) => {
    let i=0;
    while (i<5){
     cy.wait(1000);
     cy.getInfo().then((resp) => {
     if(resp.body.status !== 'finished'){
       i++;
     } else {
         i = 5;
         expect(.....);
       }
     })
   }
  })
})

while (i<5) { 语句是同步的,甚至在测试开始之前它就运行了五次迭代。

相反,这应该有效

function waitForStatus (status, count = 0) {

  if (count === 5) {
    throw 'Never finished'
  }

  return cy.getInfo().then(resp => {
    if (resp.body.status !== status) {
      cy.wait(1000)                       // may not need to wait
      waitForStatus(status, ++count)      // run again, up to 5 times
    } else {
      return resp  // in case you want to expect(resp)...
    }
  })
}

cy.processFile().then((response) => {
  waitForStatus('finished').then(resp => {
    expect(resp)...
  })
})

这里有更详细的信息Writing a Cypress Recursive Function

您的场景

npm i -D cypress-recurse
# or use Yarn
yarn add -D cypress-recurse
import { recurse } from 'cypress-recurse'

it('waits for status', () => {

  cy.processFile().then((response) => {

    recurse(
      () => cy.getInfo(),
      (resp) => resp.body.status === 'finished',
      {
        log: true,
        limit: 5, // max number of iterations
        timeout: 30000, // time limit in ms
        delay: 1000 // delay before next iteration, ms
      },
    )
    .then(resp => {
      expect(resp)...
    })
})