2014-12-04 67 views
2

在Java中,如何正确确定XPath选择器是否指定属性或元素?如何确定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

术语的一点:在XML和XPath中,文档树中的* elements *和attributes都是* nodes *。因此,而不是“属性或节点”,你问的是“属性或元素”。因此标识符WebElement,findElement等很好的问题。 – LarsH 2014-12-04 16:41:19

回答

0

缺少节点不可知的手段来解决文本内容在很多(如果不是全部的话)XPath API中是一个问题。而且,正如已经指出的那样,没有完全一般的方法来事先确定XPath表达式是否选择属性或元素,因为它可以选择两者,并且是不连续的组合。如果你可以排除不同情况(或分别对待每件),那么试探性地说,这一切都取决于表达式中最后一个斜杠后面的内容:如果余数以'@'(或'attribute ::')开头, ,你正在选择一个属性;否则,一个元素。这不是防弹的,但根据经验我发现这在实践中已经够用了。你的启发式方法和任何方法一样好。

+0

你能举例说明第一句话吗?例如,在XSLT中,获取节点的文本值没有问题,而不考虑它是属性还是元素。在Javascript XPath中也没有问题,因为您可以检查XPathResult节点的nodeType(它是一个DOM节点)并相应地提取它的值。 – LarsH 2014-12-04 18:27:57

+1

我没有包含XSLT,它具有 ...我的意思是一个通用或通用的node.text_content()方法,您不必检查类型的节点执行适当的操作 - 该方法在内部执行正确的事情 - 也可能会失败 - 对没有文本内容的节点类型的空字符串进行软化。你必须以不同的方式处理元素和属性 - 即.e. “相应地” - 正是这里的局限。 – arayq2 2014-12-04 18:43:55

+1

经过进一步的考虑,我认为你可能会反对我使用“问题”一词 - 我承认这一点。我应该使用“不幸”或“不方便”之类的东西,严格地说,这不是一个真正的问题。对于那个很抱歉! – arayq2 2014-12-04 18:50:41

1

您可能能够使用XPath expression parser这是撒克逊XSLT/XQuery的一部分处理器。

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

如果你确实弄清楚了,请发布你的代码(作为答案),因为我不知道其他人发布了解决方案。

编辑:

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

//foo | //bar/@baz 

可以返回元素,属性,两者或两者都不是,这取决于文档中存在哪些元素和属性。

但是,使用上面提到的解析工具可能会为您找出XPath表达式子集是否可以返回属性的最佳机会。

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