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

如何使用CSS选择器获取元素内未被其他标签包裹的文本内容

核心结论

CSS 选择器本身只能匹配元素节点,无法直接选中独立的文本节点,所以你没法纯靠 CSS 选择器直接定位到你要的 some_text,必须配合 JS 脚本来提取内容。

实现方案

你只需要先用最简单的 CSS 选择器 div.test 定位到目标 div 元素,再通过 JS 过滤提取它的直接文本节点即可,以下是常用场景的实现:

1. Selenium 场景(你当前用了 By.CssSelector 基本属于这个场景)

// 第一步:定位到div.test元素
WebElement testDiv = driver.findElement(By.cssSelector("div.test"));
// 第二步:执行JS提取直接文本,过滤掉span等子元素的内容
String targetText = (String) ((JavascriptExecutor) driver).executeScript(
    "return Array.from(arguments[0].childNodes)" +
    ".filter(node => node.nodeType === Node.TEXT_NODE)" +
    ".map(node => node.textContent.trim())" +
    ".join('').trim();"
, testDiv);

如果你的结构固定,some_text 一定是 div 的第一个子节点,也可以用更精简的 JS 代码:
return arguments[0].childNodes[0].nodeValue.trim();

2. 纯前端 JS 场景

const testDiv = document.querySelector('div.test');
const targetText = Array.from(testDiv.childNodes)
  .filter(node => node.nodeType === Node.TEXT_NODE)
  .map(node => node.textContent.trim())
  .join('')
  .trim();

你之前写法错误的原因

  • By.CssSelector("div[class='test'] :not(span)"):空格是后代选择器,只会匹配div.test后代里不是span的元素,文本不属于元素,不会被匹配到,加上Selenium默认getText()会返回元素所有后代的文本,所以拿到了全部内容
  • 其余带span的选择器都匹配到了span元素,自然只会返回span内的文本
  • div[class='test']:not(:last-child) 匹配的是本身不是父元素最后一个子元素的div.test,和你的需求完全不相关

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 04:45:03