【问题标题】:Want to Retrieve Xpath of Given WebElement想要检索给定 WebElement 的 Xpath
【发布时间】:2017-11-03 12:56:42
【问题描述】:

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

函数调用将类似于:- String XpathOfElement = myWebDriver.getXpath(My_Web_Element)

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

【问题讨论】:

  • 请详细说明并提供完整的代码和 HTML
  • 我有一个当前页面的 web 元素列表(elements = myDriver.getElements(By.TagName("*")).ToList)。如果我想要元素(1)的xpath,那么我会将此元素传递给所需的函数,例如String XpathOfElement = myWebDriver.getXpath(elements(1))。
  • 看看this link

标签: java c# selenium xpath selenium-webdriver


【解决方案1】:

查看此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);
}

【讨论】:

【解决方案2】:

这段代码完美运行。

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,然后使用 if-else 概念和“class:”作为拆分表达式。​​

【讨论】:

  • 对我来说,找到具有 id 或 class 的元素的 XPath 是没有意义的。
  • 这就是我提到“id”和“class:”的原因。好的生病增强代码。
  • 我们可能会借助 JavaScript。
【解决方案3】:

几乎 DOM 中的任何元素都可以有很多有效的 xPath。例如谷歌搜索页面上的输入字段可以找到://*[@id='lst-ib']//*[@class='gsfi'][1]//body//div//input[3]... 你希望得到哪一个?

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

【讨论】:

    猜你喜欢
    • 2015-05-10
    • 2020-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多