XPath :: Podążaj za rodzeństwem

85

Mam następującą strukturę HTML: próbuję zbudować solidną metodę wyodrębniania drugiego elementu skrótu koloru, ponieważ będzie wiele takich tagów w DOM.

<table>
  <tbody>
    <tr bgcolor="#AAAAAA">
    <tr>
    <tr>
    <tr>
    <tr>
      <td>Color Digest </td>
      <td>AgArAQICGQMVBBwTIRQHIwg0GUMURAZTBWQJcwV0AoEDAQ </td>
    </tr>
    <tr>
      <td>Color Digest </td>
      <td>2,43,2,25,21,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,33,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, </td>
    </tr>
  </tbody>
</table>

Próbuję wyodrębnić drugi element td „Color Digest”, który ma zdekodowaną wartość.

Napisałem następującą ścieżkę xpath, ale zamiast uzyskać drugą, nie otrzymuję drugiego elementu td.

//td[text() = ' Color Digest ']/following-sibling::td[2]

A kiedy zmieniam to na td [2] na td [1], otrzymuję oba elementy.

dodaj średniki
źródło

Odpowiedzi:

124

Powinieneś szukać drugiego tr, którego td równa się 'Color Digest', a następnie musisz spojrzeć na następne rodzeństwo pierwszego td w tr lub drugie td.

Spróbuj wykonać następujące czynności:

//tr[td='Color Digest'][2]/td/following-sibling::td[1]

lub

//tr[td='Color Digest'][2]/td[2]

http://www.xpathtester.com/saved/76bb0bca-1896-43b7-8312-54f924a98a89

james31rock
źródło
Używam Xpath Checker w przeglądarce Firefox
dodaj średniki
Użyłem tego do testowania. xpathtester.com/saved/b452f721-556c-4e9b-9758-1910b0871d4a
james31rock
1
może sprawdzanie xpath nie działa? Nigdy go nie używałem i nie mam zainstalowanego programu Firefox. XPath, który mam, powinien zwracać tylko drugi element td, gdy pierwszy element td ma „Color Digest”
james31rock
Jeśli sprawdzisz mój kod HTML, jest tam Space "Color Digest". Wypróbowałem łącze, które wysłałeś i widzisz, że oba TD są zwracane.
dodaj średniki
1
Ach, rozumiem, zmienię swoją odpowiedź. Przepraszam. Powinieneś szukać drugiego tr, którego td równa się 'Color Digest', a następnie musisz spojrzeć na następne rodzeństwo pierwszego td w tr lub drugie td.
james31rock
6

Możesz przejść do identyfikacji listy elementów za pomocą xPath:

//td[text() = ' Color Digest ']/following-sibling::td[1]

W ten sposób otrzymasz listę dwóch elementów, a następnie możesz użyć drugiego elementu jako zamierzonego. Na przykład:

List<WebElement> elements = driver.findElements(By.xpath("//td[text() = ' Color Digest ']/following-sibling::td[1]"))

Teraz możesz użyć drugiego elementu jako zamierzonego elementu, czyli elementów.get (1)

Dhaval Jethava
źródło
2

/html/body/table/tbody/tr[9]/td[1]

W przeglądarce Chrome (prawdopodobnie również Safari) możesz sprawdzić element, a następnie kliknąć prawym przyciskiem myszy tag, dla którego chcesz uzyskać ścieżkę xpath, a następnie skopiować ścieżkę xpath, aby wybrać ten element.

FarFigNewton
źródło
2
Tak, wiem, że funkcja polega na powtarzaniu tych elementów, a nie tylko na jeden, chcę zbudować solidne podejście.
dodaj średniki