2015-09-25 50 views
1

我甚至在一個頁面上意識到,具有不同CSSPathes的兩個HTML元素放置在完全不同的頁面區域中,它們具有完全相同的XPath。如何以及爲什麼會發生?有人可以向我解釋嗎?具有相同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]
    • CSSPathbody > 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]
    • CSSPathbody > div.page > div.page-content > div.right-section > div.list.mmkcontent

我試圖讓XPath和CSSPath與Chrome瀏覽器開發。工具和Firefox + Firebug:XPath無處不在。只有Firebug的擴展名爲我提供了CSSPath .list.mmk內容的第二個元素,我終於可以使用它完成我的任務。

但我仍然不明白,如何完全不同的元素可以有相同的XPath:XPath應該是從DOM樹頂部到元素的路徑...位於不同位置的元素如何以相同的方式通過DOM樹給他們?

回答

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語法,假設id是唯一的,或者通過nodename::nth-child[x]語法。語法div.a > div.b不保證唯一與CSS。

在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實現中有bug,或者當你使用在兩個調用之間改變的動態頁面時。

我沒有看到您的網頁。 XPath不同,瀏覽器(Chrome,Firefox)顯示正確的路徑。

當我嘗試,並在瀏覽器中選擇「複製XPath」,我得到這個:

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

哪些是不同的XPath。

當然,如果你使用了一些插件或其他動態構建XPath的方式,插件有一些bug是完全可能的。但是你展示的XPath是不同的,並試圖重現你的問題顯示不同的XPath。也許這只是一個小小的疏忽?

相關問題