XPath :: Получить следующего брата

85

У меня следующая структура HTML: я пытаюсь создать надежный метод для извлечения второго элемента цветового дайджеста, так как в 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>

Я пытаюсь извлечь второй td-элемент «Color Digest», который имеет декодированное значение.

Я написал следующий xpath, но вместо второго я не получаю второй элемент td.

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

И когда я меняю его с td [2] на td [1], я получаю оба элемента.

добавить точку с запятой
источник

Ответы:

124

Вы должны искать второй tr, имеющий td, равный Color Digest, тогда вам нужно посмотреть либо на следующего брата первого td в tr, либо на второй td.

Попробуйте следующее:

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

или же

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

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

james31rock
источник
Я использую Xpath Checker в firefox
добавление точки с запятой
Я использовал это для проверки. xpathtester.com/saved/b452f721-556c-4e9b-9758-1910b0871d4a
james31rock
1
может быть, программа проверки xpath не работает? Никогда не использовал и не установил firefox. Xpath, который у меня есть, должен возвращать только второй элемент td, когда первый элемент td имеет 'Color Digest'
james31rock
Если вы проверите мой HTML, там есть пробел «Color Digest», я попробовал ссылку, которую вы отправили, и вы можете увидеть, что оба TD возвращаются.
добавить точку с запятой
1
Ах, понятно, я собираюсь изменить свой ответ. Сожалею. Вы должны искать второй tr, имеющий td, равный Color Digest, тогда вам нужно посмотреть либо на следующего брата первого td в tr, либо на второй td.
james31rock
6

Вы можете определить список элементов с помощью xPath:

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

Это даст вам список из двух элементов, после чего вы сможете использовать второй элемент в качестве предполагаемого. Например:

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

Теперь вы можете использовать второй элемент в качестве предполагаемого элемента, которым является elements.get (1)

Дхавал Джетхава
источник
2

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

В Chrome (возможно, и в Safari) вы можете проверить элемент, затем щелкнуть правой кнопкой мыши по тегу, для которого вы хотите получить xpath, затем вы можете скопировать xpath, чтобы выбрать этот элемент.

FarFigНьютон
источник
2
Да, я знаю, что функция заключается в повторении этих элементов, а не в получении одного. Я хочу построить надежный подход.
добавить точку с запятой