有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何确定XPath是针对(返回)属性还是元素?

在Java中,如何正确地确定XPath选择器是以属性还是元素为目标

为了解释这个问题:我需要从WebDriver的WebElement获取文本。元素的innerText或其属性取决于XPath。不幸的是,每个提取都是不同的(见下文),因此我必须首先确定预期目标是什么,元素或属性:

String getStringValue(String selector, WebElement context) {
  if(targetsAttribute(selector) {
    WebElement node = context.findElement(new By.xpath(elemPart(selector)));
    return node.getAttribute(attrName(selector));
  } else {
    return context.findElement(new By.xpath(selector)).getText();
  }
};

我正在寻找targetsAttributeelemPartattrName方法的实现。目前我使用正则表达式:

 Pattern ATTR_PAT = Pattern.compile("^.*/@([^/]+)$");
 Pattern ELEM_PAT = Pattern.compile("^(.*)/@[^/]+$");

但我发现这种方法既丑陋又不系统。例如,它与attribute::不匹配。是否有一些方法可以使用一些标准库来实现这一点

注意:我实际上是在试图解决与下面问题类似的问题,只是稍微高一点:

How to get the value of an attribute using XPath


共 (2) 个答案

  1. # 1 楼答案

    缺乏节点无关的方法来处理文本内容在许多方面(如果不是全部的话)都是一个问题XPathAPI。而且,如前所述,没有完全通用的方法预先确定XPath表达式是否选择属性或元素,因为它可以使用析取组合选择两者

    如果您可以排除析取(或单独处理每个片段),那么启发式地,这完全取决于表达式中最后一个斜杠后面的内容:如果余数以“@”(或“attribute::”)开头,则您选择的是一个属性;否则,将创建一个元素。这不是防弹的,但根据经验,我发现这在实践中已经足够好了。你的启发式方法和其他方法一样好

  2. # 2 楼答案

    您可能可以使用XPath expression parser,它是Saxon XSLT/XQuery处理器的一部分

    ExpressionParser的parseExpression()方法应该能够为您提供所需的信息

    如果你真的弄明白了,请发布你的代码(作为答案),因为我不知道还有其他人发布了解决方案

    编辑:

    实际上,对于每个XPath表达式,不可能构造一个能够正确回答它是选择元素还是选择属性的算法。这是因为XPath表达式返回的结果类型可能取决于输入。例如,XPath表达式

    //foo | //bar/@baz
    

    根据文档中存在的元素和属性,可以同时返回元素和属性,也可以不返回

    但是,使用上面提到的解析工具可能会让您有最好的机会了解XPath表达式的子集是否可以返回属性

    在我看来,无法获取XPath表达式的字符串值(无论它选择的是元素还是属性)是WebDriverAPI中的一个严重缺陷。除非它以我不知道的其他方式提供了这种能力