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
相关产品推荐
相关产品推荐

