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

如何优化Cypress测试结构,避免使用cy.wait(xx)?

问题描述

我的测试流程如下:

  • 存储变量A的值
  • 通过API修改A的值
  • 存储A的新值
  • 验证A是否等于 A & 新变更后的值

测试逻辑本身可正常运行,但调用API后前端数据不会自动更新,因此需要重新加载页面。目前必须添加固定等待cy.wait(5000)才能定位到目标元素,否则会定位失败。测试代码片段如下:

// API请求
cy.statusHold(79338)                    
// 重新加载页面以在前端展示变更
cy.reload()   
// 除非使用此等待,否则无法定位下方元素。      
cy.wait(5000)   
cy.get('#locater')
优化方案

固定时长的硬等待并非可靠做法,建议替换为基于元素状态的智能等待,让Cypress自动等待元素就绪,既提升测试稳定性,又避免不必要的等待时间:

  1. 直接等待目标元素可见
    利用cy.get()自带的等待机制替换硬等待,Cypress默认会等待元素出现(最长4秒,可自定义超时时间):

    cy.statusHold(79338)                    
    cy.reload()   
    // 等待元素可见,超时时间设为10秒(可根据实际加载速度调整)
    cy.get('#locater', { timeout: 10000 })
    
  2. 等待页面完全加载
    如果页面刷新后有大量资源需要加载,可先等待页面load事件完成:

    cy.statusHold(79338)                    
    cy.reload()   
    // 等待页面所有资源加载完成
    cy.window().its('document.readyState').should('eq', 'complete')
    cy.get('#locater')
    
  3. 先验证API请求成功
    确保API修改操作确实完成后再刷新页面,避免因请求未结束就刷新导致的前端数据未更新:

    // 验证API请求返回成功状态
    cy.statusHold(79338).its('status').should('eq', 200)                    
    cy.reload()   
    cy.get('#locater')
    
补充提示
  • Cypress的命令本身是异步且自带等待的,尽量避免使用cy.wait()固定时长,除非是等待特定路由请求(如cy.wait('@requestAlias'))。
  • 如果元素是动态渲染的,可结合断言验证元素内容/属性,确保数据已更新后再执行后续操作:
    cy.get('#locater').should('have.text', 预期新值)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 11:54:21