有没有办法使用Java获取元素的XPath或CSS路径?

时间:2014-11-28 09:56:36

标签: java firefox selenium xpath firebug

我正在尝试使用Java获取元素的XPath和CSS路径。我已经使用jsoup来解析HTML而我正在获取CSS路径,但在某些情况下它返回了错误的路径。 (我将它与Selenium生成的路径匹配。)

我正在使用此代码生成CSS路径 我的元素是“s-Rectangle_44”

<div id="s-Rectangle_44" class="rectangle firer click commentable">
  <div class="clipping">
    <div class="content">
      <div class="valign">
        <span id="rtr-s-Rectangle_44_0"></span>
      </div>
    </div>
  </div>
</div>

硒给css路径为css =#s-Rectangle_44&gt; div.clipping&gt; div.content&gt; div.valign当我得到数组索引超出绑定异常。我也需要得到XPath。有没有其他方法来获得这个?我可以将Firebug与Java一起使用吗?

public static String getCssPath(Element el) {
  if (el == null)
    return "";

  if (!el.id().isEmpty())
    return "#" + el.id();

  StringBuilder selector = new StringBuilder(el.tagName());
  String classes = StringUtil.join(el.classNames(), ".");
  if (!classes.isEmpty())
    selector.append('.').append(classes);

  if (el.parent() == null)
    return selector.toString();

  selector.insert(0, " > ");
  if (el.parent().select(selector.toString()).size() > 1) {
    selector.append(String.format(":nth-child(%d)",
        el.elementSiblingIndex() + 1));
  }

  return getCssPath(el.parent()) + selector.toString();
}

2 个答案:

答案 0 :(得分:1)

CSS路径

根据jsoup API referenceElement有一个cssSelector()函数,它返回相关的CSS路径。

此功能只返回标识为#s-Rectangle_44的元素的s-Rectangle_44

的XPath

如果您可以假设您要匹配的每个元素都有一个ID,那么这段代码就足够了:

String getXPath(Element el)
{
  return "//*[@id='" + el.id() + "']";
}

关于您的示例,这将为您的ID为//*[@id='s-Rectangle_44']的元素返回s-Rectangle_44

还有an answer to a similar thread,其中包含绝对路径的代码。


Firebug的代码(用JavaScript编写)有functions for getting the CSS pathfunctions for getting the XPath,它们生成绝对路径并可以转换为Java。

请注意,Firebug已获得BSD许可。

答案 1 :(得分:-2)

我建议手动创建自己的XPath,因为有时你需要使用除“id”之外的其他属性和类似于当开发人员使用它来存储一些属性时,“data-id”。

获取元素的XPath的另一种方法是通过Chrome中的开发人员面板。只需右键单击该元素,然后单击复制XPath 。但是它会复制带有ID的绝对XPath。