我正在尝试使用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();
}
答案 0 :(得分:1)
根据jsoup API reference,Element
有一个cssSelector()
函数,它返回相关的CSS路径。
此功能只返回标识为#s-Rectangle_44
的元素的s-Rectangle_44
。
如果您可以假设您要匹配的每个元素都有一个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 path和functions for getting the XPath,它们生成绝对路径并可以转换为Java。
请注意,Firebug已获得BSD许可。
答案 1 :(得分:-2)
我建议手动创建自己的XPath,因为有时你需要使用除“id”之外的其他属性和类似于当开发人员使用它来存储一些属性时,“data-id”。
获取元素的XPath的另一种方法是通过Chrome中的开发人员面板。只需右键单击该元素,然后单击复制XPath 。但是它会复制带有ID的绝对XPath。