在 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();
}
};
我正在寻找 targetsAttribute
、elemPart
和 attrName
方法的实现。目前我使用正则表达式:
Pattern ATTR_PAT = Pattern.compile("^.*/@([^/]+)$");
Pattern ELEM_PAT = Pattern.compile("^(.*)/@[^/]+$");
但我发现这种方法丑陋且不系统。例如,它与 attribute::
不匹配。有没有办法使用一些标准库来做到这一点?
注意:我实际上正在尝试解决与以下问题类似的问题,只是更高一点:
最佳答案
您也许可以使用 XPath expression parser那是 Saxon XSLT/XQuery 处理器的一部分。
ExpressionParser 的 parseExpression () 方法应该能够为您提供所需的信息。
如果您弄清楚了,请发布您的代码(作为答案),因为我不知道是否还有其他人发布了解决方案。
编辑:
实际上,不可能构建一个算法来正确回答每个 XPath 表达式是选择元素还是属性。这是因为 XPath 表达式返回的结果类型可能取决于输入。例如。 XPath 表达式
//foo | //bar/@baz
可以返回元素、属性,两者都返回,或者两者都不返回,这取决于文档中存在哪些元素和属性。
但是,使用上面提到的解析工具可能会给您最好的机会来弄清楚,对于 XPath 表达式的一个子集,它们是否可以返回一个属性。
在我看来,无论它选择的是元素还是属性,都无法获取 XPath 表达式的字符串值,这是 WebDriver API 中的一个严重缺点。除非它以我不知道的其他方式提供这种能力。
关于java - 如何确定 XPath 的目标是(返回)属性还是元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27294789/