You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cypress框架中不使用while语句实现同类逻辑的替代方法

原代码失效原因

Cypress的命令采用异步队列机制,const noAvailability = cy.contains(...)返回的是永远为真值的Cypress链式对象,不是实际的DOM查询结果或布尔值,会直接触发while死循环,瞬间向命令队列塞入海量点击任务,最终占满内存导致进程崩溃。

无while循环的实现方案

利用Cypress自带的异步回调+递归逻辑实现即可,不会出现死循环占内存的问题,代码如下:

// 定义递归检查逻辑
const checkAndClickNextWeek = () => {
  cy.document().then(doc => {
    const hasNoAvailabilityTip = doc.body.textContent.includes('No time slots available. Please change interval or select another practitioner.')
    if (hasNoAvailabilityTip) {
      cy.contains('Next week').click()
      // 等待页面时段列表刷新完成,可根据页面实际加载速度调整,也可替换为等待对应查询接口返回
      cy.wait(300)
      // 刷新完成后再次检查
      checkAndClickNextWeek()
    }
  })
}

// 执行逻辑
checkAndClickNextWeek()
// 增加兜底断言,超时后自动终止,避免无限递归
cy.contains('No time slots available. Please change interval or select another practitioner.').should('not.exist')
实现注意点
  • 所有DOM状态判断都放在cy.then()回调内执行,拿到的是页面实时渲染的真实DOM结果,不会出现同步判断恒为真的逻辑错误
  • 每次点击、等待页面加载完成后才会触发下一轮检查,不会一次性向队列塞入过量命令,内存占用稳定
  • 最后的兜底断言走Cypress原生超时机制(默认超时时间4秒,可通过cy.contains(..., { timeout: 10000 }).should('not.exist')自定义超时时长),如果连续点击超过设定时间仍无可用时段,会直接抛出错误终止执行,不会无限递归
  • 如果要提升判断稳定性,可以把固定等待的cy.wait(300)替换为等待页面加载态消失、或监听时段查询接口返回完成,避免页面未渲染完成就触发判断的问题

内容的提问来源于stack exchange,提问作者alexandru15059715

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 02:42:43