Glossario · Automazione della UI
XPath
Detto anche: espressione XPath, espressioni XPath, XPath locator, locator XPath
Definizione
Linguaggio di query per selezionare nodi in un documento XML o HTML, usato nell'automazione UI per localizzare elementi in base a struttura, attributi o testo.
XPath (XML Path Language) descrive un percorso nell’albero di un documento fino ai nodi che ti interessano. Nell’automazione dei test è uno dei modi per scrivere un locator, e il suo vantaggio principale rispetto ai CSS è che può fare match sul contenuto testuale e muoversi in qualsiasi direzione: in su verso un genitore, di lato verso un fratello o in giù verso un discendente. I browser implementano XPath 1.0, quindi le funzioni delle versioni successive, come matches() o lower-case(), non sono disponibili.
Esempio
//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/')]
La quarta riga mostra perché si ricorre a XPath: trovare la riga della tabella che contiene una certa cella, poi il pulsante all’interno di quella riga.
WebElement cancel = driver.findElement(
By.xpath("//tr[td[normalize-space()='Order 1042']]//button[@aria-label='Cancel']"));
Assoluto e relativo
Un XPath assoluto parte dalla radice (/html/body/div[2]/form/button) e si rompe non appena cambia un qualsiasi wrapper. Un XPath relativo inizia con // e si ancora a qualcosa di significativo. Copiare il “full XPath” dai DevTools ti dà la forma assoluta, che in un test non è quasi mai ciò che vuoi.
Errori comuni
- Percorsi basati sugli indici come
(//div)[7]. Codificano il layout, non il significato. text()su elementi con markup annidato.//button[text()='Save']fallisce se l’etichetta si trova in uno<span>figlio.normalize-space()(o.) usa invece l’intero valore testuale.- Fare match su una classe con
@class='btn'. Funziona solo quandobtnè l’intero valore dell’attributo. Usacontains(concat(' ', normalize-space(@class), ' '), ' btn '), oppure passa al CSS.btn. - Usare XPath per abitudine. In Playwright,
getByRoleegetByTextcoprono la maggior parte dei casi basati sul testo e si leggono meglio.