如何使用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
相关产品推荐
相关产品推荐

