Glossar · UI-Automatisierung
XPath
Auch genannt: XPath-Ausdruck, XPath Locator, XML Path Language, XPath-Selektor
Definition
Eine Abfragesprache zur Auswahl von Knoten in einem XML- oder HTML-Dokument, die in der UI-Automatisierung Elemente über Struktur, Attribute oder Text lokalisiert.
XPath (XML Path Language) beschreibt einen Pfad durch einen Dokumentbaum zu den gewünschten Knoten. In der Testautomatisierung ist es eine der Möglichkeiten, einen Locator zu schreiben. Sein Hauptvorteil gegenüber CSS: Es kann auf Textinhalt matchen und sich in jede Richtung bewegen, nach oben zu einem Elternelement, seitwärts zu einem Geschwisterelement oder nach unten zu einem Nachfahren. Browser implementieren XPath 1.0, daher stehen Funktionen aus späteren Versionen wie matches() oder lower-case() nicht zur Verfügung.
Beispiel
//button[normalize-space()='Sign in']
//input[@name='email']
//label[text()='Password']/following-sibling::input
//tr[td[normalize-space()='Order 1042']]//button[@aria-label='Cancel']
//a[contains(@href, '/invoices/')]
Die vierte Zeile zeigt, warum viele zu XPath greifen: Finde die Tabellenzeile, die eine bestimmte Zelle enthält, und dann den Button innerhalb dieser Zeile.
WebElement cancel = driver.findElement(
By.xpath("//tr[td[normalize-space()='Order 1042']]//button[@aria-label='Cancel']"));
Absolut versus relativ
Ein absoluter XPath beginnt an der Wurzel (/html/body/div[2]/form/button) und bricht, sobald sich irgendein Wrapper ändert. Ein relativer XPath beginnt mit // und verankert sich an etwas Bedeutungsvollem. Wenn Sie in den DevTools den „vollständigen XPath“ kopieren, erhalten Sie die absolute Form, und die ist in einem Test fast nie das, was Sie wollen.
Häufige Fehler
- Indexbasierte Pfade wie
(//div)[7]. Sie bilden das Layout ab, nicht die Bedeutung. text()bei Elementen mit verschachteltem Markup.//button[text()='Save']schlägt fehl, wenn das Label in einem Kind-<span>steht.normalize-space()(oder.) verwendet stattdessen den vollständigen String-Wert.- Eine Klasse mit
@class='btn'matchen. Das trifft nur, wennbtnder gesamte Attributwert ist. Verwenden Siecontains(concat(' ', normalize-space(@class), ' '), ' btn ')oder wechseln Sie zu CSS.btn. - Aus Gewohnheit standardmäßig XPath verwenden. In Playwright decken
getByRoleundgetByTextdie meisten textbasierten Fälle ab und sind besser lesbar.