首页 > 解决方案 > 如何在#document 中通过 XPath 查找元素

问题描述

我有一个 html 页面<embed src=......>。里面#document是使用和嵌套的 html 页面。如何通过内部的 XPath 查找元素#document

我正在尝试使用 JavaScript

WebElement element = driver.findElement(By.xpath("//div[contains(@id,'Recaptcha')]')]"));

DOM 树的屏幕截图

标签: javascript

解决方案


XPath 将无法访问主文档中被替换元素的内容。

如果您的内容是按照 Same-Origin-Policies 加载的,那么您可以直接使用替换文档中的 XPath。但是 <embed> 是一个怪异的野兽......与 <object> 或 <iframe> 元素不同,它不公开contentDocument属性,而是公开getSVGDocument()方法。但正如它的名字所说,这种方法旨在获取 SVG 文档,并且某些浏览器(至少 Chrome)会拒绝为您提供 HTML 文档中的任何内容而 Firefox 则可以

因此,要让它在这些浏览器中工作,您需要使用其他元素,例如 <iframe>。从那里,您应该能够获取它的 contentDocument 并将其设置为 XPath 查询的根:

iframe.onload = e => {
  const doc = iframe.contentDocument; // get the contentDocument
  // evaluate XPath
  const query = doc.evaluate("//div[contains(@id,'Recaptcha')]')]", doc);
  const node = query.iterateNext();
  // ... do something with node
}

作为一个小提琴,因为 Stack-Snippets 不允许 SOP 友好的帧。


推荐阅读