Hoe XPath-voorgaande sibling correct te gebruiken

Ik schrijf tests voor mijn site met behulp van Selenium IDE en ik heb problemen met het hebben van selenium op een knop met behulp van de voorafgaande broer-sibling

<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>

Mijn pad

xpath=//button[contains(.,'Arcade Reader')]/../preceding-sibling::button[@name='settings']

Antwoord 1, Autoriteit 100%

U hoeft niet op niveau omhoog te gaan en te gebruiken ..Aangezien alle knoppen op hetzelfde niveau staan:

//button[contains(.,'Arcade Reader')]/preceding-sibling::button[@name='settings']

Antwoord 2

Ik hou ook van locators bouwen van maximaal naar beneden als:

//div[contains(@class,'btn-group')][./button[contains(.,'Arcade Reader')]]/button[@name='settings']

Het is vrij eenvoudig, zoals we gewoon zoeken btn-groupmet button[contains(.,'Arcade Reader')]en ontvang het button[@name='settings']

Dat is gewoon een andere optie om XPath-locators

te bouwen

Wat is de winst van het zoeken naar het wrapper-element: je kunt het per methode retourneren (voorbeeld in java) en gewoon seleniumconstructies bouwen zoals:

getGroupByName("Arcade Reader").find("button[name='settings']");
getGroupByName("Arcade Reader").find("button[name='delete']");

of zelfs meer vereenvoudigen

getGroupButton("Arcade Reader", "delete").click();

Other episodes