2016-07-27 3 views
2

Ich habe eine HTML-Seite den folgenden Code enthält:Selen, Java. Benötigen Sie Vorfahren Element in Tabelle auszuwählen von 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> 

Auf dieser Seite habe ich eine andere Tabelle mit demselben Klassenattribut „report“, aber nur dieser Tabelle Texte enthält " Position offen "und" Position geschlossen ". Ich muss Elemente auswählen, die die Daten "EURJPY", "116.098" und "116.156" enthalten. Diese Elemente Inhalt wird das heißt anstelle von „EURJPY“ Ändern erscheinen „EURUSD“ oder „GBPCAD“ usw. Ich habe versucht, den folgenden Code:

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

das erste Pflichtfeld Text zu bekommen, aber bekam die Invalid selector Fehler.

+1

Ich denke, Sie shold versuchen, Klammern in '(// tr)' – Andersson

+0

zu entfernen Ihr Xpath und die Logik für Ihre Anforderungen ist klar. Meinst du "Position offen" * ODER * "Position geschlossen"? Ihr Versuch testet nur nach Position Open. Sie sagen auch, dass Sie Elemente auswählen möchten, aber das FindElement() wählt nur ein einzelnes Element aus, und Ihr Beispiel schlägt vor, dass Sie nur den in der Spanne enthaltenen Text möchten. –

Antwort

3

Ihr XPath ist in der Nähe, aber es gab ein paar Probleme.

//span[text()='Position Open']/ancestor::table[@class='report'](//tr)[2]/td/span 
  1. Wenn Sie einen SPAN suchen, die den Text 'Position Open' enthält, wenn in der Tat ist es ein TH ist, der den Text enthält.

    //th[text()='Position Open']/ancestor::table[@class='report'](//tr)[2]/td/span 
    
  2. (//tr) sollte nicht der SPAN im TD, enthalten Was Sie wollen, ist der Text

    //th[text()='Position Open']/ancestor::table[@class='report']//tr[2]/td/span 
    
  3. zu //tr korrigiert werden. Wenn Sie den Text aus der TD ziehen, können Sie den gewünschten Text aus allen drei Elementen abrufen. Wenn Sie die SPAN ziehen, müssen Sie auch die letzten beiden TD s ziehen. Dieser Weg ist einfach einfacher.

  4. ... und schließlich enthält die TH mehr als nur den Text, den Sie suchen. Verwenden Sie .contains(), um eine Übereinstimmung zu erhalten.

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

So nehmen wir, dass XPath und in Java-Code setzen und wir die unten bekommen.

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

können Sie diese xpath verwenden, um die 3 <td> Tags Sie Interesse an

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

Mit ihm werden Sie geben finden Liste mit drei Elementen können Sie den Text aus ihnen extrahieren

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

Es kann Probleme geben, die mit dem Text übereinstimmen, stattdessen enthält contains diesen Selektor

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