webdriver:获取元素的xpath?

KJW*_*KJW 5 webdriver

是否可以返回WebElement的xpath?

小智 8

不是直接来自WebDriver,但如果你真的需要,你可以伪造它:

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);
}
Run Code Online (Sandbox Code Playgroud)

Javascript来自这篇文章,缩小为适合一行.它可能不完美,但可以让你知道去哪里.大多数驱动程序实现了该JavascriptExecutor接口,并具有在浏览器中执行Javascript的功能.executeScript可以返回任何原始JavaScript类型,HTML元素或任何前述的非嵌套列表.

并非所有浏览器都以相同的方式支持xpath,因此在使用这些xpath选择元素时要小心.此外,并非所有浏览器都支持原生xpath(咳嗽 IE 咳嗽),因此在这种情况下它是假的.


Yse*_*mma 5

如果By.xpath发现WebElement:在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 "";
    }
Run Code Online (Sandbox Code Playgroud)