2

我的 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']/#document: 70: 预期为 '. '、'..'、'@'、'*'、QName。

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

谢谢, 丹南杰

4

4 回答 4

2

据我所知,XPath 不会归结为iframes。您会看到,XPath 表达式与特定的 XML 文档相关联,例如 HTML 文档,1可以对它们进行评估。在浏览器中,aniframe算作一个单独的文档。<iframe>节点本身是父文档的一部分;但它只是指向另一个iframe完全独立的文档(的内容)的指针。

这似乎是这个电子邮件链的要点,并且似乎很自然地脱离了 XPath 表达式通过调用document.evaluate(即,特定document对象的成员)来评估的事实,如 Firefox 中实现的那样。这表明定义iframes 和 XPath 的各种规范之间的重叠排除了在单个 XPath 表达式中遍历该文档边界——或者至少这似乎是 Mozilla 的解释。

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

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


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

于 2016-01-25T21:14:21.747 回答
0

您还没有显示您的源 XML,但我们确定的一件事是它不包含名为“#document”的元素,因为这不是合法的元素名称。出于同样的原因,您不能在 XPath 表达式中请求名为“#document”的元素。

于 2012-05-21T09:02:21.840 回答
0

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

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

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

于 2012-05-21T20:07:48.260 回答
-1

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

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

谢谢。

于 2015-04-02T06:46:24.860 回答