web-dev-qa-db-de.com

So verwenden Sie XPath vor dem Geschwister korrekt

Ich schreibe Tests für meine Site mit Selenium IDE und ich habe Probleme damit, Selenium mit Vorgänger-Geschwistern auf eine Schaltfläche zu klicken

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

Mein Weg

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

Sie müssen kein Level aufsteigen und .. Verwenden, da sich alle Buttons auf dem gleichen Level befinden:

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

Ich baue auch gerne Locators von oben nach unten wie:

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

Es ist ziemlich einfach, da wir nur btn-group Mit button[contains(.,'Arcade Reader')] suchen und es bekommen button[@name='settings']

Dies ist nur eine weitere Option zum Erstellen von xPath-Locators

Was ist der Vorteil der Suche nach Wrapper-Elementen: Sie können es nach Methode zurückgeben (Beispiel in Java) und einfach Selenium-Konstruktionen erstellen wie:

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

oder noch mehr vereinfachen

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