我甚至在一个页面上意识到,具有不同CSSPat的两个HTML元素(位于完全不同的页面区域中)具有完全相同的XPath。它是如何以及为什么会发生的?有人可以向我解释一下吗?
第一个元素:具有默认值标准的选择。
<div class="list-sorting">
<select data-current-sorting="" name="sort" id="sort">
...</select>
</div>
/html/body/div[3]/div[1]/div[1]/div[2]
body > div.page > div.page-content > div.list-page-header > div.list-sorting
第二个元素:页面底部的文本块
<div class="list mmkcontent">...</div>
/html/body/div[3]/div[1]/div[2]/div[2]
body > div.page > div.page-content > div.right-section > div.list.mmkcontent
我尝试使用Chrome Dev获得XPath和CSSPath。工具和Firefox + Firebug:XPath无处不在。只有Firebug及其扩展名为我提供了第二个元素CSSPath .list.mmkcontent,我终于可以用来完成我的任务了。
但我仍然不明白,不同的元素可以拥有相同的XPath:XPath应该是从DOM树顶部到元素的路径......位于不同位置的元素如何具有相同的他们通过DOM树的方式?
答案 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]
,如果x
和y
是数字,则无可争辩。每个这样的路径都会选择一个唯一的元素,或者什么都不是。
如果我看你的问题,你写道:
/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。也许这只是一个轻微的疏忽?