想要检索给定WebElement的Xpath

时间:2017-11-02 07:00:23

标签: java c# selenium xpath selenium-webdriver

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

呼叫功能将如下: - String XpathOfElement = myWebDriver.getXpath(My_Web_Element)

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

3 个答案:

答案 0 :(得分:4)

检查这个post,我编写代码来获得绝对的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);
}

答案 1 :(得分:0)

此代码完美无缺。

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时有效。假设你的元素有 class ,那么使用带有“class:”的if-else概念作为split expression。

答案 2 :(得分:0)

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

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