java - 如何确定 XPath 的目标是(返回)属性还是元素?

标签 java xpath webdriver

在 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

最佳答案

您也许可以使用 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/

相关文章:

java - 用于网页警报的事件监听器

xml - 当节点前没有pcdata时,XPath选择第一个节点

java - 线程中的异常 "main"java.lang.IllegalStateException :The path to the driver executable must be set by the : system property

selenium-webdriver - 如何防止 FirefoxDriver 的日志记录?

selenium - Webdriver 在 Gmail 中打开邮件

java - 在Java中的字符串中的特定位置添加特定字符

java - 使用数据注释树节点,以便使用 Java 进化生物学库 (JEBL) 进行分析

java - JSONArray(String json) 解析一些不带引号(无效)的 JSON 时返回 "Infinite"

xml - 这两个 XQuery 之间有什么区别

php - 使用 php xPath 更改先前的同级值