Glosario · Automatización de UI
XPath
También llamado: expresión XPath, expresiones XPath, XPath expression, localizador XPath
Definición
Lenguaje de consulta para seleccionar nodos en un documento XML o HTML, que se usa en la automatización de UI para localizar elementos por estructura, atributos o texto.
XPath (XML Path Language) describe un camino a través del árbol de un documento hasta los nodos que quieres. En automatización de pruebas es una de las formas de escribir un locator, y su principal ventaja sobre CSS es que puede filtrar por el contenido de texto y moverse en cualquier dirección: hacia arriba hasta un padre, de lado hasta un hermano o hacia abajo hasta un descendiente. Los navegadores implementan XPath 1.0, así que las funciones de versiones posteriores, como matches() o lower-case(), no están disponibles.
Ejemplo
//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 cuarta línea muestra por qué se recurre a XPath: encontrar la fila de la tabla que contiene una celda concreta y, después, el botón dentro de esa fila.
WebElement cancel = driver.findElement(
By.xpath("//tr[td[normalize-space()='Order 1042']]//button[@aria-label='Cancel']"));
Absoluto frente a relativo
Un XPath absoluto empieza en la raíz (/html/body/div[2]/form/button) y se rompe en cuanto cambia cualquier contenedor. Un XPath relativo empieza con // y se ancla en algo con significado. Copiar el “full XPath” desde las DevTools te da la forma absoluta, que casi nunca es lo que quieres en un test.
Errores comunes
- Rutas basadas en índices como
(//div)[7]. Codifican el layout, no el significado. text()en elementos con marcado anidado.//button[text()='Save']falla si la etiqueta está dentro de un<span>hijo.normalize-space()(o.) usa en su lugar el valor de texto completo.- Filtrar una clase con
@class='btn'. Eso solo coincide cuandobtnes el atributo completo. Usacontains(concat(' ', normalize-space(@class), ' '), ' btn '), o pasa a CSS con.btn. - Usar XPath por costumbre. En Playwright,
getByRoleygetByTextcubren la mayoría de los casos basados en texto y se leen mejor.