Glossar · UI-Automatisierung
Locator
Auch genannt: Locators, Element-Locator, Elementlokator, Lokator
Definition
Die Abfrage, mit der ein UI-Test ein Element auf der Seite findet, etwa über Rolle und Name, eine Test-ID, einen CSS-Selektor oder einen XPath-Ausdruck.
Mit einem Locator teilt ein Test dem Browser-Treiber mit, auf welches Element er einwirken soll. Das kann ein CSS-Selektor, ein XPath-Ausdruck, eine Element-ID oder eine höherwertige Abfrage sein, etwa „der Button, dessen barrierefreier Name Anmelden lautet“. Die gute Wahl von Locatoren ist der wichtigste Einzelfaktor dafür, ob eine UI-Testsuite ein Redesign übersteht.
Beispiel
Derselbe Button, auf drei Arten lokalisiert:
// Playwright: user-facing, preferred
page.getByRole('button', { name: 'Sign in' });
// Playwright: dedicated test attribute
page.getByTestId('login-submit');
// Playwright: CSS, tied to markup structure
page.locator('form.login > button.btn-primary');
// Selenium 4
driver.findElement(By.id("login-submit"));
driver.findElement(By.cssSelector("[data-testid='login-submit']"));
Was einen guten Locator ausmacht
- Er beschreibt, was der Nutzer sieht. Rolle, Label und sichtbarer Text ändern sich nur, wenn sich das für Nutzer sichtbare Verhalten ändert, und genau dann sollte der Test ohnehin angepasst werden.
- Er ist eindeutig. Playwright-Locatoren sind strikt: Eine Aktion auf einem Locator, der zwei Elemente trifft, wirft einen Fehler, statt stillschweigend das erste zu wählen.
- Er hängt nicht vom Layout ab. Lange Pfade wie
div > div:nth-child(3) > spanbrechen, sobald ein Wrapper hinzukommt. - Er ist über Builds hinweg stabil. Generierte Klassennamen aus CSS-in-JS-Tools und automatisch hochgezählte IDs ändern sich zwischen Deployments.
Eine gängige Prioritätsreihenfolge lautet: Rolle und barrierefreier Name, dann Label oder Placeholder, dann ein mit den Entwicklern vereinbartes data-testid, dann CSS und als letztes Mittel XPath.
Lazy versus eager
Ein Playwright-Locator ist lazy (verzögert ausgewertet). Er speichert die Abfrage und löst sie bei jeder Aktion und jeder Assertion neu auf, weshalb er nicht veralten kann. Seleniums findElement ist eager (sofort ausgewertet): Es liefert eine WebElement-Referenz auf den Knoten, der in diesem Moment existierte. Rendert das DOM neu, kann diese Referenz veralten (stale werden). Selenium-Code speichert daher meist By-Objekte und sucht das Element erst, wenn es gebraucht wird.