2013-10-20 50 views
1

我試圖找到一個頁面上的特定元素,但無法找出正確的Xpath使用。Selenium Java Xpath複雜元素確定一個兄弟的子項

下面是HTML(注意,每個div的位置可能有所不同):

<div> 
    <label>First Name</label> 
    <span class="metadataField metadataFieldReadonly"> 
     <input type="text" name="some-random-value" value="John"> 
    </span> 
    </div> 
    <div> 
    <label>Last Name</label> 
    <span class="metadataField metadataFieldReadonly"> 
     <input type="text" name="some-random-value" value="Smith"> 
    </span> 
    </div> 

所以我試圖找到INPUT元素是// DIV/SPAN [@類=」 metadataField metadataFieldReadonly '] /輸入在具有// DIV /標籤[文本同一div()=' 最後名稱']

我可以成功地找到與此(使用JAVA)標籤:

driver.findElement(By.xpath("//div/label[text()='Last Name']")).click(); 

我可以成功y隨此找到的第一個元素下的第一個輸入(但我可能不會總是希望第一個元素):

driver.findElement(By.xpath("//div/span[@class='metadataField metadataFieldReadonly']/input")).click(); 

所以問題是:(i)本輸入名稱標籤和值總是不同的,所以他們不能被用來挑選元素,(ii)帶有姓氏標籤的div可能並不總是第二個,並且(iii)標籤和跨度是相同的級別(兄弟姐妹),所以我無法弄清楚如何正確地創建Xpath語句。

所以換言之,我需要在同一個div中找到span中的輸入,該div中包含'Last Name'標籤。

所以我需要知道如何將這兩個XPath語句組合成一個複雜的語句(假設他們是在同一div和標籤和跨度是兄弟):

//div/label[text()='Last Name'] 
    //div/span[@class='metadataField metadataFieldReadonly']/input 

感謝

回答

5

這很簡單://div[label[text()='Last Name']]/span[@class='metadataField metadataFieldReadonly']/input - 字面意思是,「input包含在spanmetadataFieldmetadataFieldReadonly類包含在div包含label文本'Last Nam e'「。所以你使用標籤來定位div,然後從它建立到你想要的輸入。

爲了更健壯,您不應該依賴類名的排序 - 這不是規格保證的。所以這樣的事情會更強://div[label[text()='Last Name']]/span[contains(concat(' ', @class,' '),' metadataField ') and contains(concat(' ',@class,' '),' metadataFieldReadonly ')]/input

+0

現在很容易,現在我看到如何做到這一點大聲笑!我現在可以看到你如何使用標籤周圍的方括號來選擇特定的div ......這是我無法弄清的!接受爲正確答案。謝謝 – jsherk

+0

和+1的額外信息類名稱排序:) – jsherk

+0

「標籤周圍的_square括號選擇一個特定的div_」的作品,因爲大多數人認爲作爲一個地方來檢查一個屬性值實際上是一個非常強大的條件表達模型。走出去征服:-) –