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

如何根据子元素中拆分的文本定位HTML元素?

定位文本拆分到多个子元素的DOM节点

问题场景

需要定位的元素带有哈希类名,原本可通过文本或cy.focused()方法定位,但该元素在失焦再聚焦过程中会重新挂载,无法复用之前的.focused()结果。尝试使用cy.contains('abcdefgh').click()(字符串为动态值)时,由于文本被拆分到多个子div中,无法成功定位目标元素,DOM结构如下:

<div class="kj45k4h535Hashed">
  <div class="input-text">
    <div>ab</div>
    <div>cd</div>
    <div>ef</div>
    <div>gh</div>
  </div>
</div>

解决方案

1. 定位父容器并验证拼接文本

cy.contains()仅匹配单个元素的文本内容,无法识别多个子元素拼接后的完整文本。可以先定位到带哈希类名的父容器,获取其完整文本后进行匹配:

const dynamicText = 'abcdefgh'
cy.get('.kj45k4h535Hashed')
  .invoke('text')
  .then(text => {
    // 去除文本中的换行、空格等冗余字符后对比
    expect(text.replace(/\s+/g, '')).to.equal(dynamicText)
  })
  .click()

如果父容器的文本无多余空白字符,也可以直接用断言简化写法:

const dynamicText = 'abcdefgh'
cy.get('.kj45k4h535Hashed')
  .should('have.text', dynamicText)
  .click()

2. 封装自定义命令复用逻辑

如果需要多次处理这类场景,可以封装成Cypress自定义命令:

在cypress/support/commands.js中添加:

Cypress.Commands.add('containsCombinedText', (selector, targetText) => {
  return cy.get(selector).then($el => {
    const combinedText = $el.text().replace(/\s+/g, '')
    expect(combinedText).to.equal(targetText)
    return $el
  })
})

测试中直接调用:

const dynamicText = 'abcdefgh'
cy.containsCombinedText('.kj45k4h535Hashed', dynamicText).click()

3. 结合聚焦状态重新定位

由于元素重新挂载后旧的聚焦元素失效,可以在触发聚焦后重新获取当前聚焦元素并验证文本:

const dynamicText = 'abcdefgh'
// 触发元素聚焦
cy.get('.kj45k4h535Hashed').click()
// 重新获取聚焦元素并验证文本
cy.focused()
  .invoke('text')
  .should('eq', dynamicText.replace(/\s+/g, ''))

内容的提问来源于stack exchange,提问作者Marc Sloth Eastman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:57:15