Ответ 1
Вам не нужно подниматься вверх и использовать ..
, поскольку все кнопки находятся на одном уровне:
//button[contains(.,'Arcade Reader')]/preceding-sibling::button[@name='settings']
Я пишу тесты для своего сайта с использованием Selenium IDE, и у меня возникают проблемы с нажатием кнопки selenium на кнопке, использующей предыдущий родной брат
<td>
<div class="btn-group">
<button class="btn btn btn-danger block" title="Warning, Delete" name="delete" type="button">
<button class="btn btn btn-default block" title="View History" name="history" type="button">
<button class="btn btn btn-default block" title="View Settings" name="settings" type="button">
<button class="btn btn btn-default block" name="device" type="button">
<span class="glyphicon glyphicon-pencil"/>
Arcade Reader
</button>
</div>
</td>
Мой путь
xpath=//button[contains(.,'Arcade Reader')]/../preceding-sibling::button[@name='settings']
Вам не нужно подниматься вверх и использовать ..
, поскольку все кнопки находятся на одном уровне:
//button[contains(.,'Arcade Reader')]/preceding-sibling::button[@name='settings']
Мне также нравится создавать локаторы сверху вниз, например:
//div[contains(@class,'btn-group')][./button[contains(.,'Arcade Reader')]]/button[@name='settings']
Это довольно просто, поскольку мы просто выполняем поиск btn-group
с помощью button[contains(.,'Arcade Reader')]
и получаем его button[@name='settings']
это еще один вариант для создания локаторов xPath)
Какова прибыль поиска элемента оболочки: вы можете вернуть его методом (пример в java) и просто построить селеновые конструкции, например:
getGroupByName("Arcade Reader").find("button[name='settings']");
getGroupByName("Arcade Reader").find("button[name='delete']");
или даже упростить больше
getGroupButton("Arcade Reader", "delete").click();