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

Cypress分页表格查找指定ID行并删除时,变量无法替换硬编码值的问题

Cypress分页表格查找指定ID行并删除时,变量无法替换硬编码值的问题

嘿,我明白你遇到的问题了——把硬编码的15换成函数参数id后,代码就找不到目标行了对吧?这是因为你直接在:contains()里写id的话,jQuery会把它当成字面量字符串去匹配,而不是你传入的变量值,自然就找不到对应的行啦。

我给你两个解决方案,你可以根据需求选择:

方案1:用ES6模板字符串嵌入变量

这是最简单的修改方式,把选择器用反引号包裹,用${id}把变量插入进去,这样jQuery就能识别到变量的实际值了:

deleteRowByID(id){
  cy.get('nb-card-body').then(body =>{
    // 用模板字符串把变量id注入到contains选择器中
    const targetRows = body.find('td:nth-child(2)').filter(`:contains(${id})`)
    if(targetRows.length > 0){
      cy.contains('td:nth-child(2)', id)
        .parent('tr')
        .find('.nb-trash')
        .click()
    } else {
      // 加个判断:如果下一页按钮不可用,说明已经到最后一页了,终止递归
      cy.get('[aria-label="Next"]').then(nextBtn => {
        if(nextBtn.is(':enabled')){
          cy.wrap(nextBtn).click()
          this.deleteRowByID(id)
        } else {
          throw new Error(`未找到ID为${id}的行,请检查ID是否正确`)
        }
      })
    }
  })
}

方案2:用精确匹配替代:contains()(更严谨)

:contains()有个小问题——它会匹配包含目标字符串的内容,比如你要找ID=15,它可能会误匹配到150、215这类行。如果需要精确匹配,你可以用.filter()的回调函数来做:

deleteRowByID(id){
  cy.get('nb-card-body').then(body =>{
    // 精确匹配单元格文本和传入的id(注意转成字符串,避免类型不匹配)
    const targetRows = body.find('td:nth-child(2)').filter((index, element) => {
      return Cypress.$(element).text().trim() === id.toString()
    })
    if(targetRows.length > 0){
      cy.contains('td:nth-child(2)', id)
        .parent('tr')
        .find('.nb-trash')
        .click()
    } else {
      cy.get('[aria-label="Next"]').then(nextBtn => {
        if(nextBtn.is(':enabled')){
          cy.wrap(nextBtn).click()
          this.deleteRowByID(id)
        } else {
          throw new Error(`未找到ID为${id}的行,请检查ID是否正确`)
        }
      })
    }
  })
}

另外我还帮你加了下一页按钮的可用性判断,避免到最后一页还继续递归点击,导致不必要的错误。

备注:内容来源于stack exchange,提问作者Bazy1i

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 11:05:27