0

訪問第二個元素鑑於此頁面片斷如何使用相關的XPath

<section id="mysection"> 
    <div> 
     <div> 
      <div> 
       <a href=""> 
       <div>first</div> 
       </a> 
      </div> 
      <div> 
       <a href=""> 
       <div>second</div> 
       </a> 
      </div> 
     </div> 
    </div> 
</section> 

我想用相關的XPath訪問第二個一元。在FF(及硒IDE定位)這個

//section[@id='mysection']//a[1] 

的作品,但這種不匹配

//section[@id='mysection']//a[2] 

有什麼不對的第二體現在哪裏?

編輯:其實我不太在乎Selenium IDE(只是用它來快速驗證)。我想在Robot Framework中使用selenium2library。這裏,輸出是:

ValueError: Element locator with prefix '(//section[@id' is not supported

對建議的解決方案(//section[@id='mysection']//a)[2]

回答

3

您可以使用此。這將選擇節的錨點後代並讓你成爲第二個節點。這適用於XSLT處理器,希望這個作品與硒

//section[@id='mysection']/descendant::a[2] 
+0

太好了。這也適用於Selenium。我以前曾與'兄弟姐妹'合作過,但我認爲'後裔'更接近我的思維方式。 –

1

嘗試,而不是這樣:

(//section[@id='mysection']//a)[2] 

//a[2]查找相同的父內<a>元素。由於每個家長<div>只包含一個<a>孩子,因此您的xpath不匹配任何內容。

+0

使用Selenium IDE 2.9.0:找不到[[error] locator:(// section [@ id ='mysection'] // a)[2]'這不起作用 '[error] locator not發現:(// section [@ id ='mysection'] // a)[1]' –

+0

我沒有Selenium在這裏,但[xpath tester](http://www.freeformatter.com/xpath-tester .html)返回給定HTML片段的預期元素作爲輸入XML – har07

+0

是的,您是對的。 FF控制檯在此返回1:'$ x(「(// section [@ id ='mysection'] // a)[2]」)。length'。謝謝你的解釋。這似乎是一個硒特定的問題。我編輯了我的問題,並提出了你的答案。 –

1

有了這個:

//section[@id='mysection']//a[1] 

你匹配任何範圍內的所有第一「一」元素(一個DIV中,例如),但與此

//section[@id='mysection']//a[2] 

你試圖匹配任何具有任何上下文的第二個「a」元素,但是在任何節點中都沒有多於一個「a」元素。 因此,icrementing兄弟節點應該是這些「a」標籤的父div節點。

很簡單:

//section[@id='mysection']//a[1] - both elements 

這就是爲什麼圍繞整個事情paranthesis以前的答案是正確的。

//section[@id='mysection']//div[1]/a - only first element 
//section[@id='mysection']//div[2]/a - only second elemnt 

其他方式馬赫每個 'A' 分開:

//section[@id='mysection']//a[div[text()='first']] 
//section[@id='mysection']//a[div[text()='second']] 
+0

謝謝。這正是我提出的解決方法。我的問題頁面摘錄不是我正在使用的真實頁面。有了真正的頁面,我對嵌套深度一無所知。我可以做的唯一假設是有一些錨元素嵌套在某些div元素鏈中,所以循環遍歷//段[@ id ='mysection'] // div [$ {index}]/a'作品。但關於這個問題,我認爲這是一個解決方法。 –

0

其他方式來達到第二一個元素可以通過使用

<div>second</div>, call this bottom-up approach 

,而不是從部分元素開始

<section id="mysection">, call this top-down approach 

使用元素的DIV孩子,解決方案應該是這樣的:

//div[.='second']/..