Glossario · Automazione della UI
Locator
Detto anche: localizzatore, localizzatori, element locator, selettore di elementi
Definizione
La query con cui un test UI trova un elemento nella pagina, ad esempio ruolo e nome, un test id, un selettore CSS o un'espressione XPath.
Un locator (localizzatore) è il modo in cui un test indica al driver del browser su quale elemento agire. Può essere un selettore CSS, un’espressione XPath, l’id di un elemento o una query di livello più alto come “il pulsante il cui nome accessibile è Sign in”. Scegliere bene i locator è il fattore singolo più importante per capire se una suite UI sopravvivrà a un redesign.
Esempio
Lo stesso pulsante localizzato in tre modi:
// 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']"));
Cosa rende buono un locator
- Descrive ciò che vede l’utente. Ruolo, label e testo visibile cambiano solo quando cambia il comportamento visibile all’utente, cioè esattamente quando il test andrebbe aggiornato comunque.
- È univoco. I locator di Playwright sono strict: un’azione su un locator che corrisponde a due elementi lancia un errore invece di scegliere silenziosamente il primo.
- Non dipende dal layout. Percorsi lunghi come
div > div:nth-child(3) > spansi rompono appena viene aggiunto un wrapper. - È stabile tra una build e l’altra. I nomi di classe generati dagli strumenti CSS-in-JS e gli id auto-incrementali cambiano da un deploy all’altro.
Un ordine di priorità comune è: ruolo e nome accessibile, poi label o placeholder, poi un data-testid concordato con gli sviluppatori, poi CSS e infine XPath come ultima risorsa.
Lazy contro eager
Un Locator di Playwright è lazy: memorizza la query e la risolve di nuovo ogni volta che esegui un’azione o un’asserzione, ed è per questo che non può diventare stale. Il findElement di Selenium invece è eager: restituisce un riferimento WebElement al nodo che esisteva in quel momento. Se il DOM viene ri-renderizzato, quel riferimento può diventare stale, quindi il codice Selenium di solito memorizza oggetti By e trova l’elemento solo quando serve.