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

Cypress如何查询网页元素值并配对获取商品新旧价格

问题原因

你这段代码拿不到配对返回值的核心原因是Cypress的命令全是异步排队执行的,内层then里return的[$el1, $el2]只会停在内层的Cypress调用链里,不会穿透两层嵌套传到外层,你在嵌套外面写分析逻辑的时候,根本拿不到这两个元素的值。
而且如果你的商品列表里有多组原价、折扣价,直接全局选.el1和.el2很容易出现价格错配——比如第一个商品的原价配了第二个商品的折后价,算出来的折扣全是错的。

可直接用的实现代码
  • 单组价格场景(页面只有1个原价、1个折后价)
    用Cypress.Promise.all把两个取元素的逻辑包一层,就能直接拿到配对好的结果,建议取元素的时候直接把文本取出来转成数字,省得后续再处理:
cy.then(() => {
  return Cypress.Promise.all([
    cy.get('.el1').invoke('text').then(text => Number(text.trim().replace(/[^\d.]/g, ''))),
    cy.get('.el2').invoke('text').then(text => Number(text.trim().replace(/[^\d.]/g, '')))
  ])
}).then(([originalPrice, discountPrice]) => {
  // 所有价格对比、折扣计算逻辑全写在这里
  const discount = (discountPrice / originalPrice * 10).toFixed(1)
  // 举个断言例子:折扣不低于3折
  cy.wrap(Number(discount)).should('be.gte', 3)
})
  • 多商品列表场景(多组价格配对)
    别全局搜两类价格标签,直接遍历每个商品的父容器,在单个商品容器范围内找对应的原价、折后价,从根源上避免配错对:
// 把.product-item替换成你页面里单个商品卡片的选择器
cy.get('.product-item').each($productCard => {
  const originalPrice = Number($productCard.find('.el1').text().trim().replace(/[^\d.]/g, ''))
  const discountPrice = Number($productCard.find('.el2').text().trim().replace(/[^\d.]/g, ''))
  // 单商品的价格校验、折扣计算直接在这里写
  expect(discountPrice).to.be.lessThan(originalPrice)
})

踩坑提醒:别在Cypress命令链外面写同步的价格分析代码,所有依赖页面元素值的逻辑,必须放到对应取值命令的回调里跑,否则大概率拿到undefined,因为代码执行的时候页面元素还没取到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 09:36:19