Webdriver: get xpath element?

is it possible to return xpath for WebElement?

+3
source share
8 answers

Not directly from WebDriver, but you can fake it if you really need to:

public String getElementXPath(WebDriver driver, WebElement element) {
    return (String)((JavascriptExecutor)driver).executeScript("gPt=function(c){if(c.id!==''){return'id(\"'+c.id+'\")'}if(c===document.body){return c.tagName}var a=0;var e=c.parentNode.childNodes;for(var b=0;b<e.length;b++){var d=e[b];if(d===c){return gPt(c.parentNode)+'/'+c.tagName+'['+(a+1)+']'}if(d.nodeType===1&&d.tagName===c.tagName){a++}}};return gPt(arguments[0]).toLowerCase();", element);
}

Javascript is from this post , reduced to fit one line. This may not be perfect, but it can give you an idea of ​​where to go. Most drivers implement the interface JavascriptExecutorand have the ability to run Javascript in a browser. executeScriptcan return any primitive JavaScript type, HTML element or non-nested list of any of the previous ones.

xpath , , xpaths . , xpath ( IE cough), .

+9

WebElement By.xpath: Java:

public static String GetWebElementXpath(WebElement El) throws AssertionError{
        if ((El instanceof WebElement)){
            Object o = El;
            String text = o.toString();
        /* text is smth like this
        [[FirefoxDriver: firefox on WINDOWS (9170d4a5-1554-4018-adac-f3f6385370c0)] -> xpath: //div[contains(@class,'forum-topic-preview')]//div[contains(@class,'small-human')]]
        */
            text = text.substring( text.indexOf("xpath: ")+7,text.length()-1);
            return text;
        }else   {   Assert.fail("Argument is not an WebElement, his actual class is:"+El.getClass());       }
        return "";
    }
+4

. XPath .toLowerCase(), XPath, , .

: //div[@id="deviceblock-1111"] <div id="deviceBlock-1111">

.toLowerCase() , XPath, : //DIV[@id="deviceBlock-1111"]/DIV[2]/SELECT[1]/OPTION[5]

, .

public String GetElementXPath(WebElement element, WebDriver driver)
{
    return (String) ((JavascriptExecutor) driver).executeScript(
    "getXPath=function(node)" +
    "{" +
        "if (node.id !== '')" +
        "{" +
            "return '//' + node.tagName.toLowerCase() + '[@id=\"' + node.id + '\"]'" +
        "}" +

        "if (node === document.body)" +
        "{" +
            "return node.tagName.toLowerCase()" +
        "}" +

        "var nodeCount = 0;" +
        "var childNodes = node.parentNode.childNodes;" +

        "for (var i=0; i<childNodes.length; i++)" +
        "{" +
            "var currentNode = childNodes[i];" +

            "if (currentNode === node)" +
            "{" +
                "return getXPath(node.parentNode) + 
                    '/' + node.tagName.toLowerCase() + 
                    '[' + (nodeCount+1) + ']'" +
            "}" +

            "if (currentNode.nodeType === 1 && " +
                "currentNode.tagName.toLowerCase() === node.tagName.toLowerCase())" +
            "{" +
                "nodeCount++" +
            "}" +
        "}" +
    "};" +

    "return getXPath(arguments[0]);", element);
}

XPath WebElement.

//DIV[@id="deviceBlock-1111"]/DIV[2]/SELECT[1]/OPTION[5]

+3
public String getElementXPath(WebDriver driver, WebElement element) {

    String javaScript = "function getElementXPath(elt){" +
                            "var path = \"\";" +
                            "for (; elt && elt.nodeType == 1; elt = elt.parentNode){" +
                                "idx = getElementIdx(elt);" +
                                "xname = elt.tagName;" +
                                "if (idx > 1){" +
                                    "xname += \"[\" + idx + \"]\";" +
                                "}" +
                                "path = \"/\" + xname + path;" +
                            "}" + 
                            "return path;" +
                        "}" +
                        "function getElementIdx(elt){" +
                            "var count = 1;" +
                            "for (var sib = elt.previousSibling; sib ; sib = sib.previousSibling){" +
                                "if(sib.nodeType == 1 && sib.tagName == elt.tagName){" +
                                    "count++;" +
                                "}" +
                            "}" +
                            "return count;" + 
                        "}" +
                        "return getElementXPath(arguments[0]).toLowerCase();";      

    return (String)((JavascriptExecutor)driver).executeScript(javaScript, element);     

}
+1

XPath JavaScript.

  • XPath, body.
  • NoSuchElementException.
  • getText XPath.
0
public static String getXPathFromElement(WebElement element) {
        String elementDescription = element.toString();
        return elementDescription.substring(elementDescription.lastIndexOf("-> ") + 3, elementDescription.lastIndexOf("]"));
}

- toString() :

'[[FirefoxDriver: firefox WINDOWS (ceb69f9f-bef4-455d-b626-ab439f195be6)] β†’ id: pageBeanfundDescription]'

id/xpath.

0
/**
 * This method return By reference for the WebElement passed to it as a parameter.
 * @param element
 * @return
 */
public static By convertWebElementToByReference(WebElement element) 
{
    By byLocator = null;
    String elementDescription = element.toString();
    String elementTypeAndValue[] = (elementDescription.substring(elementDescription.lastIndexOf("-> ") + 3, elementDescription.lastIndexOf("]"))).split(":");        

    switch (elementTypeAndValue[0].trim()) 
    {
        case "id": byLocator = By.id(elementTypeAndValue[1].trim());
           break;

        case "xpath": byLocator = By.xpath(elementTypeAndValue[1].trim());
           break;

        case "link text": byLocator = By.linkText(elementTypeAndValue[1].trim());
           break;

        case "tag name": byLocator = By.tagName(elementTypeAndValue[1].trim());
           break;

        case "class name": byLocator = By.className(elementTypeAndValue[1].trim());
           break;

        case "partial link text": byLocator = By.partialLinkText(elementTypeAndValue[1].trim());
           break;

        case "name": byLocator = By.name(elementTypeAndValue[1].trim());
           break;

        case "css selector": byLocator = By.cssSelector(elementTypeAndValue[1].trim());
           break;

        default:
            throw new RuntimeException("Invalid locator type: " + elementTypeAndValue[0].trim());
    }

    return byLocator;
}
0

dflems ', .

Converting an entire xpath to lowercase is fine, unless the xpath contains id values ​​that are not all lowercase. The following is a modified version of javascript dflems, but in Python instead of Java:

def get_xpath_from_element(driver, element):
    return driver.execute_script("gPt=function(c){if(c.id!==''){return'id(\"'+c.id+'\")'}if(c===document.body){return c.tagName}var a=0;var e=c.parentNode.childNodes;for(var b=0;b<e.length;b++){var d=e[b];if(d===c){return gPt(c.parentNode)+'/'+c.tagName.toLowerCase()+'['+(a+1)+']'}if(d.nodeType===1&&d.tagName===c.tagName){a++}}};return gPt(arguments[0]);", element)

0
source

Source: https://habr.com/ru/post/1774759/


All Articles