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

如何使用Cypress提取维基百科文本出生日期并断言日期大小

现有代码存在的问题
  • 断言逻辑完全硬编码:当前expect(1940).to.be.lessThan(1942)是直接写死的固定数值,没有真正提取页面上的出生日期做比较,就算页面出生日期修改、展示错误,断言也会正常通过,完全不符合测试需求。
  • 元素选择器极度脆弱:使用:nth-child(8)、:nth-child(6)这类基于元素顺序的选择器,只要维基百科页面结构稍有调整、元素顺序变化,选择器就会直接失效,导致测试用例无理由报错。
  • 固定等待不合理:cy.wait(7000)属于硬编码固定等待,页面加载速度快时会浪费执行时间,加载速度慢时7秒可能还没加载完成,反而会导致后续元素查找失败。Cypress自带元素自动等待机制,完全不需要手动加固定等待。
  • 没有实现日期提取逻辑:当前代码只是用contains验证页面存在对应日期文本,没有把文本提取出来存储、做后续比较,没有完成需求要求的"提取后断言"逻辑。
  • 未处理Cypress异步特性:Cypress的命令都是异步链式执行,直接用普通变量赋值拿不到页面元素内容,需要用.then()回调处理异步返回的元素结果。
优化建议
  1. 替换不稳定的元素选择器:优先使用语义化、不易变更的选择器,比如直接用属性选择器定位两人的维基链接,用维基百科标准的.bday类定位出生日期(维基的信息框出生日期都会加这个class标识,稳定性极高)。
  2. 实现日期提取与转换逻辑:提取出日期文本后转成Date对象,通过时间戳比较先后,不需要硬编码任何日期数值,逻辑更通用严谨。
  3. 移除固定等待:依赖Cypress的自动等待机制,后续元素查找命令会自动等待页面加载完成,必要时可以单独给元素查找加timeout参数自定义超时时间。
  4. 优化测试命名:给测试用例起语义化的名称,方便后续排查问题。
优化后的代码
describe('iCONNECT Test Suite', function () {
  it('verify John Lennon was born earlier than Paul McCartney', function () {
    let paulBirthTime, lennonBirthTime
    cy.visit('https://en.wikipedia.org/wiki/The_Beatles')
    // 点击第一个保罗的链接
    cy.get('a[href="/wiki/Paul_McCartney"]').first().click()
    // 提取保罗的出生日期转成时间戳
    cy.get('.bday').invoke('text').then(dateStr => {
      paulBirthTime = new Date(dateStr).getTime()
    })
    // 返回披头士页面
    cy.go('back')
    // 点击第一个列侬的链接
    cy.get('a[href="/wiki/John_Lennon"]').first().click()
    // 提取列侬的出生日期转成时间戳后比较
    cy.get('.bday').invoke('text').then(dateStr => {
      lennonBirthTime = new Date(dateStr).getTime()
      expect(lennonBirthTime).to.be.lessThan(paulBirthTime)
    })
  })
})

内容的提问来源于stack exchange,提问作者Asad Bin Zaman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 20:36:04