#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']