我的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
答案 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")));
感谢。