具有相同XPath的不同元素?它是如何以及为什么会发生的?

时间:2015-09-25 08:58:29

标签: html xpath

我甚至在一个页面上意识到,具有不同CSSPat的两个HTML元素(位于完全不同的页面区域中)具有完全相同的XPath。它是如何以及为什么会发生的?有人可以向我解释一下吗?

示例http://goo.gl/P4oZmW

  1. 第一个元素:具有默认值标准的选择。

    <div class="list-sorting">
    <select data-current-sorting="" name="sort" id="sort">
     ...</select>
    </div>
    
    • XPath /html/body/div[3]/div[1]/div[1]/div[2]
    • CSSPath body > div.page > div.page-content > div.list-page-header > div.list-sorting
  2. 第二个元素:页面底部的文本块

    <div class="list mmkcontent">...</div>
    
    • XPath /html/body/div[3]/div[1]/div[2]/div[2]
    • CSSPath body > div.page > div.page-content > div.right-section > div.list.mmkcontent
  3. 我尝试使用Chrome Dev获得XPath和CSSPath。工具和Firefox + Firebug:XPath无处不在。只有Firebug及其扩展名为我提供了第二个元素CSSPath .list.mmkcontent,我终于可以用来完成我的任务了。

    但我仍然不明白,不同的元素可以拥有相同的XPath:XPath应该是从DOM树顶部到元素的路径......位于不同位置的元素如何具有相同的他们通过DOM树的方式?

1 个答案:

答案 0 :(得分:1)

  

具有不同CSSPathes的两个HTML元素(位于完全不同的页面区域中)具有完全相同的XPath。它是如何以及为什么会发生的?

是的,这很容易看到。 XPath是一种灵活的语言,可以选择零个或多个元素。 CSS也是一种灵活的语言,可以选择零个或多个元素,但它们的语法不同:

<p class="foo bar">
   <div>test</test>
</p>

这里两个不同的CSS选择器.foo div.bar div将选择相同的元素。这些不同的XPath表达式/p/div/p[1]/div[1]/p[div]/*[1]/../div/p[@class="foo bar"]/div都指向相同的<div>元素,但却非常不同。

CSS和XPath中都有一种方法可以定义确切路径。在CSS中,唯一确定的方法是#id语法,假设ids是唯一的,或通过nodename::nth-child[x]语法。使用CSS语法div.a > div.b 无法保证唯一

在XPath中,通常的方式是/foo[x]/bar[y],如果xy是数字,则无可争辩。每个这样的路径都会选择一个唯一的元素,或者什么都不是。

如果我看你的问题,你写道:

/html/body/div[3]/div[1]/div[1]/div[2]

/html/body/div[3]/div[1]/div[2]/div[2]

是相同的XPath,但它们不是。此外,它们不遵循foo[x]/bar[y]语法,但我可以假设只有一个html和一个body元素,在这种情况下无关紧要。

第一个选择页面上的<div class="list-sorting">,第二个选择页面上的<div class="list mmkcontent">

  

但我仍然不明白,不同的元素可以拥有相同的XPath:XPath应该是从DOM树顶部到元素的路径......位于不同位置的元素如何具有相同的他们通过DOM树的方式?

一个XPath可以选择多个元素,在这种情况下,您可以争辩一个XPath选择两个元素。但是你建议选择一个元素的一个XPath再次选择另一个元素,这是不可能的,除非对于XPath实现中的错误,或者当你使用在两个调用之间发生变化的动态页面时。

我没有看到你的页面。 XPath是不同的,浏览器(Chrome,Firefox)显示正确的路径。

当我尝试选择&#34;复制XPath&#34;在浏览器中,我得到了这个:

/html/body/div[3]/div[1]/div[1]/div[2]
/html/body/div[3]/div[1]/div[2]/div[2]

哪些是不同的XPath。

当然,如果您使用了一些插件或其他动态构建XPath的方法,那么插件完全有可能存在一些错误。但是你展示的XPath是不同的,试图重现你的问题显示不同的XPath。也许这只是一个轻微的疏忽?