2017-03-24 172 views
2

绝对的XPath我使用Javascript在下面的代码检索Web元素的绝对XPath获取网页元素

public String getAbsoluteXPath(WebDriver driver) 
{ 
    return (String) 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]);", this.element); 

} 

一般情况下,这将产生正确的结果。但是,如果我导航到stackoverflow.com并尝试检索XPath ID为.//*[@id='hot-network-questions']/h4/a(“热网络问题”)的元素的XPath,则实际/预期XPath(根据Firebug)为:html/body/div[3]/div/div[3]/div[3]/h4/a但是,此脚本错误地生成值为:/html[1]/body[1]/div[3]/div[1]/div[3]/div[4]/h4[1]/a[1]

注意div [3]和div [4]之间的区别。

+0

这是你的脚本中的一个非常微妙的错误,或者它只是绝对'xpaths'的症状是不可靠的。您的结果在相同的加载页面上有所不同吗?或者它是不同的浏览器实例,导航到网站产生不同的结果?如果它不是同一个实例,那么我的猜测是这个页面在第二次通过时略有不同。 – mrfreester

+0

为什么你需要绝对xpath? – lauda

回答

0

current页面下面的值给我你的代码返回时,试图找出 WebElement

/html[1]/body[1]/div[3]/div[1]/div[1]/div[4]/div[6]/h4[1]/a[1] 

可能是依赖于您的会话到现场,哪些部分正在此时所显示;您可以尝试通过xpath在执行此代码的同一会话上进行查看。