想要检索给定WebElement的Xpath

使用Selenium WebDriver,我有一个页面中所有Web元素的列表。 我想编写一个函数,它将返回传递元素的XPath字符串。

Call for Function将如下所示: – String XpathOfElement = myWebDriver.getXpath(My_Web_Element)

提示 : – 我认为我们可以使用javascript(使用JavaScriptExecuter)。 但不熟悉javascript。

查看这篇文章 ,我编写代码来获得绝对的XPath。

 public static String getAbsoluteXPath(WebElement element) { return (String) ((JavascriptExecutor) driver).executeScript( "function absoluteXPath(element) {"+ "var comp, comps = [];"+ "var parent = null;"+ "var xpath = '';"+ "var getPos = function(element) {"+ "var position = 1, curNode;"+ "if (element.nodeType == Node.ATTRIBUTE_NODE) {"+ "return null;"+ "}"+ "for (curNode = element.previousSibling; curNode; curNode = curNode.previousSibling) {"+ "if (curNode.nodeName == element.nodeName) {"+ "++position;"+ "}"+ "}"+ "return position;"+ "};"+ "if (element instanceof Document) {"+ "return '/';"+ "}"+ "for (; element && !(element instanceof Document); element = element.nodeType == Node.ATTRIBUTE_NODE ? element.ownerElement : element.parentNode) {"+ "comp = comps[comps.length] = {};"+ "switch (element.nodeType) {"+ "case Node.TEXT_NODE:"+ "comp.name = 'text()';"+ "break;"+ "case Node.ATTRIBUTE_NODE:"+ "comp.name = '@' + element.nodeName;"+ "break;"+ "case Node.PROCESSING_INSTRUCTION_NODE:"+ "comp.name = 'processing-instruction()';"+ "break;"+ "case Node.COMMENT_NODE:"+ "comp.name = 'comment()';"+ "break;"+ "case Node.ELEMENT_NODE:"+ "comp.name = element.nodeName;"+ "break;"+ "}"+ "comp.position = getPos(element);"+ "}"+ "for (var i = comps.length - 1; i >= 0; i--) {"+ "comp = comps[i];"+ "xpath += '/' + comp.name.toLowerCase();"+ "if (comp.position !== null) {"+ "xpath += '[' + comp.position + ']';"+ "}"+ "}"+ "return xpath;"+ "} return absoluteXPath(arguments[0]);", element); } 

这段代码完美无缺。

 public String getXpath(WebElement ele) { String str = ele.toString(); String[] listString; if(str.contains("xpath") listString = str.split("xpath:"); else if(str.contains("id") listString = str.split("id:"); String last = listString[1].trim(); return last.substring(0, last.length() - 1); } 

仅当WebElement具有xpath时,上述function才有效。 假设你的元素有 ,那么使用带有“class:”的if-else概念作为split表达式。

几乎DOM中的任何元素都可以拥有大量有效的xPathes。 例如,Google搜索页面上的输入字段可以找到: //*[@id='lst-ib'] //*[@class='gsfi'][1] //body//div//input[3] …你期望得到哪一个?

实际上google在chrome中有这个算法。 我们可以复制元素的xpath,在大多数情况下它很糟糕。 所以它可以这样做,如果它对你看看NHtmlUnit非常重要 – 你可以获得页面的dom,在那里找到你的元素并转到根元素添加标签到路径字符串。 我想,得到像//body/div/div[2]/div[3]/...这样的东西是有道理的但是为什么呢?