2016-07-27 47 views
2

選擇表裏面的祖先元素我有一個包含下面的代碼的HTML頁面:。需要與XPath

<table class="report" style="width:100%"> 
    <tbody> 
     <tr> 
     <th/> 
     <th>Position Open 
      <br> 
      <span class="timestamp">27/7/2016 16:12:12</span> 
      </br> 
     </th> 
     <th>Position closed 
      <br> 
      <span class="timestamp">27/7/2016 16:12:42</span> 
      </br> 
     </th> 
     </tr> 
     <tr> 
     <td> 
      <span dir="ltr">EURJPY</span> 
     </td> 
     <td>116.098</td> 
     <td>116.156</td> 
     </tr> 
    </tbody> 
</table> 

在這個頁面上我有相同的類屬性「報告」,但僅此表中的另一表中包含文本「位置打開「和」位置關閉「。 我需要選擇包含「EURJPY」,「116.098」和「116.156」數據的元素。 這些元素的內容,即改變的,而不是「歐元兌日元」可能出現「歐元兌美元」或「GBPCAD」等 我嘗試下面的代碼:

driver.findElement(By.xpath("//span[text()='Position Open']/ancestor::table[@class='report'](//tr)[2]/td/span")).getAttribute("textContent"); 

拿到第一必填字段的文本,但得到了Invalid selector錯誤。

+1

我想你應該試着去掉括號中的'(// tr)' – Andersson

+0

你的xpath和你的需求的邏輯很清楚。你的意思是「職位空缺」*或*「職位空缺」?你的嘗試只測試位置打開。另外,你說你想選擇元素,但FindElement()只選擇一個元素,而你的示例建議你只需要包含在span中的文本。 –

回答

3

您的XPath已關閉,但有幾個問題。

//span[text()='Position Open']/ancestor::table[@class='report'](//tr)[2]/td/span 
  1. 您正在搜索包含文本「的位置打開」時,實際上它是一個TH包含文本SPAN

    //th[text()='Position Open']/ancestor::table[@class='report'](//tr)[2]/td/span 
    
  2. (//tr)應更正爲//tr

    //th[text()='Position Open']/ancestor::table[@class='report']//tr[2]/td/span 
    
  3. 你想要的是包含在TD,而不是SPAN文本。如果您從TD中提取文本,則可以從所有三個元素中獲取所需的文本。如果您拉動SPAN,那麼您還需要拉動最後兩個TD s。這種方式更簡單。

  4. ...最後,TH不僅包含您正在查找的文本。使用.contains()獲得一場比賽。

    //th[text()='Position Open']/ancestor::table[@class='report']//tr[2]/td 
    

所以我們採取了XPath,並把它轉換爲Java代碼,我們可以得到以下。

List<WebElement> tds = driver.findElements(By.xpath("//th[contains(text(),'Position Open')]/ancestor::table[@class='report']//tr[2]/td")); 
for (WebElement td : tds) 
{ 
    System.out.println(td.getText()); 
} 
2

您可以使用此xpath找到3個<td>標記你的興趣

//th[contains(text(),'Position Open')]/ancestor::table//tr[2]/td 

使用它會給你三個元素的列表,你可以從他們

提取文本
List<WebElement> tds = driver.findElement(By.xpath"//th[contains(text(),'Position Open')]/ancestor::table//tr[2]/td"); 
String currency = tds.get(1).getText(); // this will be EURJPY 
tds.get(2).getText(); // 116.098 
tds.get(3).getText(); // 116.156 
3

有時可能會出現與文字相符的問題,請使用含有替代方法,請嘗試使用此選擇器

//th[contains(.,'Position')]/ancestor::table[@class='report']//tr[2]/td/span