web-dev-qa-db-fra.com

Comment utiliser XPath précédent-frère correctement

J'écris des tests pour mon site à l'aide de Selenium IDE) et j'ai des difficultés à avoir Selenium à cliquer sur un bouton avec le lien précédent/frère

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

Mon chemin

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

Vous n'avez pas besoin de monter de niveau et d'utiliser .. puisque tous les boutons sont au même niveau:

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

J'aime aussi construire des localisateurs de haut en bas comme:

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

C'est assez simple, car nous cherchons simplement btn-group Avec button[contains(.,'Arcade Reader')] et obtenons c'est button[@name='settings']

C'est juste une autre option pour construire des localisateurs xPath

Quel est le bénéfice de rechercher un élément wrapper: vous pouvez le retourner par méthode (exemple en Java) et simplement construire des constructions Selenium comme:

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

ou même simplifier plus

getGroupButton("Arcade Reader", "delete").click();
2
Vitaliy Moskalyuk