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
相关产品推荐
相关产品推荐

