в selenium найдите следующий родственный элемент элемента с определенным дочерним css-селектором

#selenium #xpath #css-selectors

Вопрос:

У меня есть такое дерево, как это:

 <table>
<tbody>
<tr>
 <td>
  <span>MySpan1</span>
 </td>
<tr>
<tr>
 <td>
 </td>
 <td>
  <div>
   <a title="my_title1"></a>
  </div>
 <td>
</tr>

<tr>
 <td>
  <span>MySpan2</span>
 </td>
<tr>
<tr>
 <td>
 </td>
 <td>
  <div>
   <a title="my_title2"></a>
  </div>
 <td>
</tr>
</tbody>
</table>
 

Мне нужно выбрать <a title="my_title2"></a> , зная, что у его tr родителя должен быть брат или сестра tr/td/span[contains(text(),'MySpan2')]

Если это невозможно с помощью селектора css, то можно ли это сделать с помощью xpath?

Ответ №1:

Пожалуйста, используйте этот xpath

 //span[contains(text(),'MySpan2')]/ancestor::tr/following-sibling::tr[2]/descendant::a[@title='my_title2']
 

мы нацеливаемся MySpan2 на промежуток, затем переходим к ancestor которому tr , затем мы должны перейти ко второму following-sibling , а затем нацелиться на тег с заголовком my_title2

Вы не можете использовать css selector для этого, xpath есть только выбор.

Мы движемся вверх, HTMLDOM поэтому css это должно быть исключено.

Пожалуйста, обратитесь к осям xpath

Обновить :

Независимо от tr числа братьев и сестер :

 //span[contains(text(),'MySpan2')]/ancestor::tr/following-sibling::tr/descendant::a[@title='my_title2']
 

Комментарии:

1. Да, спасибо! Мне пришлось изменить только следующее-sibling::tr[1], и это сработало. Спасибо!

2. Соглашение в SO заключается в том, чтобы отметить ответ как принятый, щелкнув галочку/галочку рядом с ответом.

3. На самом деле, я обнаружил, что это не лучшее решение, так как неизвестно, сколько <tr> у меня есть под MySpan2. Например:<tr> <tr> <td> <span>MySpan2</span> </td> <tr> <tr> <td> </td> <td> <div> <a title="my_title2"></a> </div> <td> </tr><tr> <tr> <td> </td> <td> <div> <a title="my_title3"></a> </div> <td> </tr> , Но это определенно касается названия названия. Можно ли найти родного брата известного титульного имени?

4. Проверьте обновление выше.

Ответ №2:

Это то, что сработало для меня:
//span[contains(text(),'MySpan2')]/ancestor::tr/following-sibling::tr/td/div/a[@title='my_title2']