【问题标题】:Get Absolute XPath of Web Element获取 Web 元素的绝对 XPath
【发布时间】:2017-08-17 15:41:16
【问题描述】:

我在以下代码中使用 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)是:@987654325 @ 然而这个脚本错误地产生了值:/html[1]/body[1]/div[3]/div[1]/div[3]/div[4]/h4[1]/a[1]

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

【问题讨论】:

  • 这可能是您的脚本中的一个非常微妙的错误,或者这只是绝对 xpaths 不可靠的症状。您的结果在同一个加载页面上是否不同?还是浏览器的不同实例和导航到产生不同结果的站点?如果不是同一个实例,我的猜测是页面在您第二次通过时呈现略有不同。
  • 为什么需要绝对 xpath?
  • 我尝试实现您的代码以根据提供的 Web 元素的相对 XPath 找到绝对 XPath,但我遇到了类似“线程“主”中的异常 org.openqa.selenium.WebDriverException:未知的问题错误:无法读取未定义的属性“toLowerCase”。你能帮助我可能会错过什么。谢谢

标签: java html selenium xpath


【解决方案1】:

current 页面上,您的代码在尝试识别时向我返回以下值 WebElement

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

这可能取决于您与网站的会话以及当时显示的部分;您可以尝试在执行此代码的同一会话中通过 xpath 进行搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    相关资源
    最近更新 更多