我尝试使用以下路径通过xpath定位元素但是收到以下错误。 xpath有可能找到这个元素吗?或者这是驱动程序本身的问题?
我希望能够区分/ p [4] / text()[1]和/ p [4] / text()[2]
中的值.//*[@id='content']/p[4]/text()[1]
org.openqa.selenium.InvalidSelectorException: The given selector .//*[@id='content']/p[4]/text()[1] is either invalid or does not result in a WebElement. The following error occurred:
InvalidSelectorError:xpath表达式“.//* [/ id ='content'] / p [4] / text()[1]”的结果是:[object XrayWrapper [object Text]]。它应该是一个元素。
这是一个例子的html。我试图用/ text()验证文本'(会话的额外问题)。
<div class="ad_field">
<label for="survey_id">Survey</label>
(extra questions for session)
<br>
</div>
答案 0 :(得分:5)
嗯,问题是这个XPath表达式不会找到你的元素,而是你选择了一些文本。
也就是说,错误消息还告诉您:
The given selector [...] does not result in a WebElement.
您已经要求.//*[@id='content']/p[4]/text()[1]
以函数/text()
结尾,该函数不选择节点,而是选择文本。我不确定/text()[1]
会做什么但是假设它会选择该文本中的第二个字符。至少我认为可以安全地假设它不会将文本神奇地转换为DOM元素。
WebDriver假设您的表达式导致它可以表示为WebElement
的DOM元素。这个表达式不会因此抛出表达式。
作为提示,您应该打开网页并使用工具在有疑问时手动检查您的XPath。我将Firebug与FirePath AddOn一起用于此,但您可以随意使用您认为有用的任何内容。
答案 1 :(得分:1)
我相信'text()[1]'部分在使用xpath查找元素时是不可接受的。 driver.findElement(By.xpath())在网页中查找标记。但是你的xpath .// * [/ id ='content'] / p [4] / text()[1]并没有指向任何标签。
driver.findElement(By.xpath(".//*[@id='content']/p[4]")).getText();
使用上面的代码获取文本到String并对其进行字符串操作以区分文本。
如果这有助于您,请告诉我。
答案 2 :(得分:0)
使用这个代替:
//*[@id='content']/p[4][1]
要删除/text()
,将使xpath
的特殊text node
起作用。