有没有办法在 Selenium WebDriver 中使用 JavaScript 通过 XPath 获取元素?

IT技术 javascript selenium selenium-webdriver xpath document.evaluate
2021-01-10 05:07:02

我正在寻找类似的东西:

getElementByXpath(//html[1]/body[1]/div[1]).innerHTML

我需要使用 JS 获取元素的 innerHTML(在 Selenium WebDriver/Java 中使用它,因为 WebDriver 无法找到它本身),但是如何?

我可以使用 ID 属性,但并非所有元素都具有 ID 属性。

[固定的]

我正在使用 jsoup 在 Java 中完成它。这适合我的需要。

6个回答

您可以使用document.evaluate

如果可能,计算 XPath 表达式字符串并返回指定类型的结果。

它是w3 标准化的并完整记录:https : //developer.mozilla.org/en-US/docs/Web/API/Document.evaluate

function getElementByXpath(path) {
  return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}

console.log( getElementByXpath("//html[1]/body[1]/div[1]") );
<div>foo</div>

https://gist.github.com/yckart/6351935

Mozilla 开发者网络上也有很好的介绍:https : //developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript#document.evaluate


替代版本,使用XPathEvaluator

var xpathResult = document.evaluate( xpathExpression, contextNode, namespaceResolver, resultType, result );
2021-03-13 05:07:02
我写了一个 getElementByXPath 函数,它支持 IE,但现在有一些基本的 xpath 支持。那里还有一个函数 getElementXpath ,它们可以很好地协同工作以满足我的需要。gist.github.com/Joopmicroop/10471650
2021-03-15 05:07:02
@WillSheppard XPathResult.FIRST_ORDERED_NODE_TYPE === 9 developer.mozilla.org/en-US/docs/...
2021-03-28 05:07:02
2021-04-05 05:07:02
神奇的数字9是什么意思?在这里使用命名常量会更好。
2021-04-07 05:07:02

在 Chrome Dev Tools 中,您可以运行以下命令:

$x("some xpath")
这需要更高。Firefox 也支持它。
2021-03-18 05:07:02
这在您调试网页时非常有用。谢谢。
2021-03-22 05:07:02
我玩过这个,它似乎工作,但有没有关于这个功能的文档?我什么也没找到。
2021-03-26 05:07:02
$x 不会在脚本中工作,它仅用于控制台。接受的答案适用于在浏览器上下文中运行的脚本。
2021-04-08 05:07:02

对于 chrome 命令行 api 中的 $x 之类的东西(选择多个元素),请尝试:

var xpath = function(xpathToExecute){
  var result = [];
  var nodesSnapshot = document.evaluate(xpathToExecute, document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );
  for ( var i=0 ; i < nodesSnapshot.snapshotLength; i++ ){
    result.push( nodesSnapshot.snapshotItem(i) );
  }
  return result;
}

此 MDN 概述有所帮助:https : //developer.mozilla.org/en-US/docs/Introduction_to_using_XPath_in_JavaScript

要识别WebElement使用您必须使用evaluate()评估xpath表达式并返回结果的方法。


文档.评估()

document.evaluate()返回一个XPathResult基于一个的XPath表达式和其它给定的参数。

语法是:

var xpathResult = document.evaluate(
  xpathExpression,
  contextNode,
  namespaceResolver,
  resultType,
  result
);

在哪里:

  • xpathExpression: 表示要评估的 XPath 的字符串。
  • contextNode:指定查询的上下文节点。通常的做法是document作为上下文节点传递
  • namespaceResolver:将传递任何命名空间前缀的函数,并应返回一个表示与该前缀关联的命名空间 URI 的字符串。它将用于解析 XPath 本身内的前缀,以便它们可以与文档匹配。null在 HTML 文档或不使用名称空间前缀时很常见。
  • resultType: 一个整数,它对应于使用命名常量属性返回的结果 XPathResult 的类型,例如XPathResult.ANY_TYPEXPathResult 构造函数的 ,这些属性对应于从 0 到 9 的整数。
  • result:用于结果的现有 XPathResult。null是最常见的,会创建一个新的 XPathResult

示范

作为一个例子,搜索框的内谷歌的主页,其可唯一使用被识别的XPath//*[@name='q'],也可以使用识别 通过以下命令控制台

$x("//*[@name='q']")

快照:

googlesearchbox_xpath

也可以使用document.evaluate()xpath表达式来识别相同的元素,如下所示:

document.evaluate("//*[@name='q']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;

快照:

document_evalute_xpath

您可以使用 javascript 的document.evaluate在 DOM 上运行 XPath 表达式。我认为它在浏览器中以一种或另一种方式支持回到 IE 6。

MDN:https : //developer.mozilla.org/en-US/docs/Web/API/Document/evaluate

IE 支持selectNodes

MSDN:https : //msdn.microsoft.com/en-us/library/ms754523(v= vs.85) .aspx

我想指出 {document.evaluate} 在 IE 中不起作用。
2021-03-27 05:07:02