查找xpath表达式面临的问题

查找xpath表达式面临的问题,xpath,Xpath,我的XPath'//div[@id='sharetools-container-div']/iframe[@id='sharetools-iframe']工作正常,但是在这个标记之后有'.\document'文本,在这个'.\document'之后有html标记,所以当我将XPath表达式扩展为'//div[@id='sharetools-container-div']/iframe'][@id='sharetools-iframe']/#document/html',它引发异常,如下所示: 原

我的XPath
'//div[@id='sharetools-container-div']/iframe[@id='sharetools-iframe']
工作正常,但是在这个标记之后有
'.\document'
文本,在这个
'.\document'
之后有html标记,所以当我将XPath表达式扩展为
'//div[@id='sharetools-container-div']/iframe'][@id='sharetools-iframe']/#document/html'
,它引发异常,如下所示:

原因:类org.jaxen.saxpath.XPathSyntaxException: //div[@id='sharetools-container-div']/iframe[@id='sharetools-iframe']/#文档: 70:应为“.”、“..”、“@”、“*”和QName中的一个

因此,请指导我如何为此编写XPath

谢谢,
Dhananjay

您尚未显示源XML,但我们可以肯定的是,它不包含名为“#document”的元素,因为这不是合法的元素名称。出于同样的原因,您不能请求名为“#document”的元素在XPath表达式中。

可以与不同的XPath一起使用,以绕过单词:#文档和单词:后代 例如:

//div[@id='sharetools-container-div']/iframe[@id='sharetools-iframe']/descendant::*[1]

或者诸如此类。这取决于您希望内部html中包含什么内容。

首先要感谢您提出这个问题。我也面临同样的问题。 在下面这句话的帮助下,我的案子得到了解决

driver.SwitchTo().Frame(driver.FindElement(By.Name("fraToc")));

谢谢。

据我所知,XPath不会下降到
iframe
s。你看,XPath表达式绑定到特定的XML文档,例如HTML文档,1可以对其进行评估。在浏览器中,
iframe
算作一个单独的文档。
节点本身是父文档的一部分但它只是指向另一个完全独立的文档(iframe的内容)的指针

这似乎是本文的要点,而且似乎与XPath表达式是通过调用(即,特定
文档
对象的成员)进行计算这一事实是自然而然的这表明定义
iframe
s和XPath的各种规范之间的重叠不包括在单个XPath表达式中遍历文档边界,或者至少这似乎是Mozilla的解释

但请注意,所有这些都是基于Firefox对
XPath
规范的特定实现的猜测。这个限制可能适用于也可能不适用于其他浏览器,但我怀疑它确实适用

这似乎也解释了为什么Selenium要求您将上下文从一个文档(父HTML页面)切换到另一个文档(iframe本身),以便对其执行XPath表达式,正如@singaravelan发布的解决方案所暗示的



1但前提是HTML文档足够神奇!(并非所有HTML文档都是格式良好的XML:浏览器比XML解析器要宽松得多;参见@MathiasMüller的评论。)

因此(这只是基于常见情况的猜测),您可能只需要删除
#文档
部分即可使XPath正常工作。如果您想更详细地解释原因,请向我们展示XML的关键部分,以便我们可以告诉您该
#文档
文本是什么。@Michael Kay,我在另一个html页面中有一个html页面。因此我想从内部html页面访问元素。Bu它不起作用。所以我需要为此编写xpath。在这个xpath“//div[@id='sharetools-container-div']/iframe[@id='sharetools-iframe']”之后,我的内部html页面以html标记开始。所以我需要类似“//div[@id='sharetools-container-div']/iframe[@id='sharetools-iframe']/这可能是因为它们是独立的文档(假设XHTML
iframe
tag语义),XPath不是跨文档的?OP的问题与Selenium无关,您没有提到;我理解您所说内容的唯一原因是因为我之前看到了。这真的有效吗?在哪些浏览器(或其他XPath实现)中有效?谢谢。“特定的XML文档,如HTML文档”-注意措辞,HTML不一定是格式良好的XML。除此之外,这个答案是正确的。哦,天哪!格式错误的HTML的暴虐!我想,浏览器对HTML文档的理想化概念!