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

VB.NET中如何通过Selenium获取元素的第4个子文本节点?

问题描述

我需要用VB.NET开发程序,获取页面中指定文本并显示在MessageBox里,目标文本为:My friend is going to watch a film in cinema but there is no tickets.。右键获取的完整XPath是:

/html/body/div[7]/div[3]/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[1]/div/div/div[9]/div/div[1]/div[2]/div/table/tbody/tr[1]/td[4]/div[1]/text()[4]

使用以下VB.NET代码时触发错误:

MsgBox(driver.FindElement(By.XPath("/html/body/div[7]/div[3]/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[1]/div/div/div[9]/div/div[1]/div[2]/div/table/tbody/tr[1]/td[4]/div[1]/text()[4]")))

错误信息:

OpenQA.Selenium.InvalidSelectorException: 'invalid selector: The result of the xpath expression "/html/body/div[7]/div[3]/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[1]/div/div/div[9]/div/div[1]/div[2]/div/table/tbody/tr[1]/td[4]/div[1]/text()[4]" is: [object Text]. It should be an element.


错误原因

Selenium的FindElement方法要求XPath必须定位到DOM元素节点,但你写的XPath结尾用了text()[4],直接指向了div下的第4个文本节点(而非元素),因此触发该异常。


解决方法

方法1:通过JavaScript执行XPath获取文本节点内容

利用Selenium的IJavaScriptExecutor接口,直接执行XPath获取文本节点的字符串值:

' 转换driver为JavaScript执行器
Dim jsExecutor As IJavaScriptExecutor = DirectCast(driver, IJavaScriptExecutor)
' 执行XPath获取目标文本
Dim targetText As String = jsExecutor.ExecuteScript(
    "return document.evaluate('/html/body/div[7]/div[3]/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[1]/div/div/div[9]/div/div[1]/div[2]/div/table/tbody/tr[1]/td[4]/div[1]/text()[4]', document, null, XPathResult.STRING_TYPE, null).stringValue;"
).ToString()
' 显示文本
MsgBox(targetText)

方法2:定位父元素后拆分文本

先定位到包含目标文本的父元素,再通过拆分文本内容提取第4段:

' 定位父元素(去掉XPath结尾的text()[4])
Dim parentDiv = driver.FindElement(By.XPath("/html/body/div[7]/div[3]/div/div[2]/div[2]/div/div/div/div/div[2]/div/div[1]/div/div/div[9]/div/div[1]/div[2]/div/table/tbody/tr[1]/td[4]/div[1]"))
' 拆分父元素的所有文本,过滤空行
Dim textSegments = parentDiv.Text.Split(vbCrLf, StringSplitOptions.RemoveEmptyEntries)
' 检查是否存在第4段(数组索引从0开始,对应索引3)
If textSegments.Length >= 4 Then
    MsgBox(textSegments(3))
Else
    MsgBox("未找到目标文本")
End If

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 02:20:28