面临问题找到xpath表达式

时间:2012-05-21 07:06:06

标签: xpath

我的XPath '//div[@id='sharetools-container-div']/iframe[@id='sharetools-iframe']'工作正常,但在此标记之后存在'#document'文本,此后'#document'有html标记,因此当我将XPath表达式扩展为{{ 1}},它抛出异常如下:

  

引起:class org.jaxen.saxpath.XPathSyntaxException:   // DIV [@ ID = 'sharetools容器-DIV'] / iframe中[@ ID = 'sharetools的iframe'] /#文件:   70:预期的'。','..','@','*',QName。

所以请指导我如何为此编写XPath。

谢谢, Dhananjay

4 个答案:

答案 0 :(得分:2)

从我可以收集的内容来看,XPath并没有下降到iframe s。你看,XPath表达式与特定的XML文档相关联,例如HTML文档, 1 可以评估。在浏览器中,iframe计为单独的文档。 <iframe>节点本身是父文档的一部分;但它只是指向另一个完全独立的文档(iframe的内容)的指针。

这似乎是这个email chain的要点,并且似乎自然地脱离了通过调用document.evaluate来评估XPath表达式的事实(即,特定{{1}的成员在Firefox中实现的对象)。这表明定义document和XPath的各种规范之间的重叠排除了在单个XPath表达式中遍历该文档边界 - 或者至少看起来是Mozilla的解释。

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

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

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

答案 1 :(得分:0)

您尚未展示源XML,但我们确切知道的一件事是它不包含名为“#document”的元素,因为它不是合法的元素名称。出于同样的原因,您不能在XPath表达式中请求名为“#document”的元素。

答案 2 :(得分:0)

您可以使用不同的XPath绕过单词:#document,单词:descendant 例如:

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

或类似的东西。这取决于内部html中你想要的什么

答案 3 :(得分:-1)

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

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

感谢。