Mira la lección en vídeo
Accede al vídeo completo de esta lección y a más contenido exclusivo con el Plan Plus.
Desbloquear Plan PlusQué son los localizadores relativos
Los localizadores relativos representan una de las innovaciones más significativas introducidas en Selenium 4, diseñada para resolver uno de los problemas más comunes en la automatización de pruebas: localizar elementos que no poseen identificadores únicos o atributos distintivos. Esta funcionalidad, conocida inicialmente como Friendly Locators, permite encontrar elementos basándose en su posición espacial relativa a otros elementos conocidos en la página.
La estrategia tradicional de localización en Selenium se basa en atributos estáticos del DOM como id
, name
, class
, o selectores XPath y CSS. Sin embargo, muchas aplicaciones web modernas generan interfaces dinámicas donde los elementos pueden carecer de identificadores únicos o estos pueden cambiar frecuentemente. Los localizadores relativos abordan esta limitación permitiendo localizar elementos mediante su posición geométrica en relación con otros elementos de referencia.
Funcionamiento interno
Los localizadores relativos utilizan internamente la función JavaScript getBoundingClientRect()
para determinar las coordenadas y dimensiones de los elementos en la página. Esta función devuelve un objeto que contiene información sobre la posición del elemento respecto al viewport, incluyendo propiedades como top
, left
, width
y height
.
// Sintaxis básica con RelativeLocator
WebElement referenceElement = driver.findElement(By.id("reference"));
WebElement targetElement = driver.findElement(
RelativeLocator.with(By.tagName("input"))
.above(referenceElement)
);
El proceso interno funciona de la siguiente manera: Selenium calcula las coordenadas del elemento de referencia, determina la región espacial donde debería encontrarse el elemento objetivo según la relación especificada, y finalmente busca elementos que coincidan con el selector base dentro de esa región.
Sintaxis y estructura
Los localizadores relativos se construyen utilizando la clase RelativeLocator
junto con el método estático with()
. La estructura básica requiere dos componentes principales: un selector base que define el tipo de elemento a buscar, y uno o más métodos de relación que especifican la posición espacial.
@Test
void testRelativeLocatorBasicSyntax() {
// Elemento de referencia conocido
WebElement loginButton = driver.findElement(By.id("login-btn"));
// Localizar input que está arriba del botón de login
WebElement usernameField = driver.findElement(
RelativeLocator.with(By.tagName("input"))
.above(loginButton)
);
usernameField.sendKeys("usuario@ejemplo.com");
}
La sintaxis alternativa utilizando withTagName()
ofrece una forma más concisa para casos comunes:
WebElement element = driver.findElement(
withTagName("button").below(referenceElement)
);
Casos de uso prácticos
Los localizadores relativos resultan especialmente útiles en formularios complejos donde los campos pueden no tener identificadores únicos pero mantienen una disposición visual consistente. Por ejemplo, en un formulario de registro donde cada campo está posicionado relativamente a una etiqueta o a otros campos.
@Test
void testFormWithRelativeLocators() {
// Localizar campo de email basándose en la etiqueta
WebElement emailLabel = driver.findElement(By.xpath("//label[text()='Email']"));
WebElement emailInput = driver.findElement(
RelativeLocator.with(By.tagName("input"))
.toRightOf(emailLabel)
);
emailInput.sendKeys("test@example.com");
}
Otro escenario frecuente son las tablas dinámicas donde los datos pueden cambiar pero la estructura relativa se mantiene. Los localizadores relativos permiten navegar por celdas basándose en headers conocidos o celdas de referencia.
Limitaciones importantes
Es fundamental comprender que los localizadores relativos tienen limitaciones específicas que pueden afectar su efectividad. No funcionan correctamente con elementos que se superponen visualmente, ya que el cálculo de posiciones puede resultar ambiguo. Además, requieren que el elemento de referencia sea visible y esté renderizado en el DOM en el momento de la búsqueda.
La precisión de los localizadores relativos también depende del diseño responsivo de la aplicación. En diseños que cambian significativamente entre diferentes tamaños de pantalla, las relaciones espaciales pueden volverse impredecibles, afectando la fiabilidad de las pruebas.
Los localizadores relativos representan una evolución natural en las estrategias de localización, complementando los métodos tradicionales con capacidades espaciales que reflejan mejor cómo los usuarios perciben e interactúan con las interfaces web modernas.
Métodos above(), below(), toLeftOf(), toRightOf(), near()
Guarda tu progreso
Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.
Más de 25.000 desarrolladores ya confían en CertiDevs
Los cinco métodos principales de los localizadores relativos proporcionan un conjunto completo de relaciones espaciales para navegar por elementos web basándose en su posición visual. Cada método implementa una lógica específica de cálculo de coordenadas que determina qué elementos califican como candidatos válidos según su ubicación relativa.
Método above()
El método above()
localiza elementos que se encuentran verticalmente por encima del elemento de referencia. Internamente, compara las coordenadas Y de los elementos candidatos con las del elemento de referencia, seleccionando aquellos cuya posición superior es menor.
@Test
void testAboveMethod() {
WebElement submitButton = driver.findElement(By.id("submit-btn"));
// Buscar el campo de contraseña que está arriba del botón submit
WebElement passwordField = driver.findElement(
RelativeLocator.with(By.tagName("input"))
.above(submitButton)
);
passwordField.sendKeys("mi_contraseña_segura");
}
Este método resulta especialmente útil en formularios verticales donde los campos se apilan uno encima del otro. La búsqueda considera todos los elementos que estén por encima, sin importar la distancia vertical específica.
Método below()
El método below()
funciona de manera inversa a above()
, localizando elementos posicionados verticalmente debajo del elemento de referencia. Compara las coordenadas Y seleccionando elementos cuya posición inferior es mayor que la del elemento de referencia.
@Test
void testBelowMethod() {
WebElement titleElement = driver.findElement(By.tagName("h1"));
// Encontrar el primer párrafo que aparece debajo del título
WebElement firstParagraph = driver.findElement(
RelativeLocator.with(By.tagName("p"))
.below(titleElement)
);
String paragraphText = firstParagraph.getText();
assertThat(paragraphText).isNotEmpty();
}
La utilidad de below()
se manifiesta en estructuras de contenido donde elementos como párrafos, imágenes o secciones siguen un orden vertical predecible respecto a elementos de referencia como títulos.
Método toLeftOf()
El método toLeftOf()
identifica elementos posicionados horizontalmente a la izquierda del elemento de referencia. La lógica compara las coordenadas X, seleccionando elementos cuya posición derecha es menor que la posición izquierda del elemento de referencia.
@Test
void testToLeftOfMethod() {
WebElement searchButton = driver.findElement(By.className("search-btn"));
// Localizar el campo de búsqueda que está a la izquierda del botón
WebElement searchInput = driver.findElement(
RelativeLocator.with(By.tagName("input"))
.toLeftOf(searchButton)
);
searchInput.sendKeys("término de búsqueda");
searchButton.click();
}
Este método es fundamental para interfaces horizontales como barras de herramientas, navegación o formularios en línea donde los elementos se organizan de izquierda a derecha.
Método toRightOf()
El método toRightOf()
opera como el complemento de toLeftOf()
, localizando elementos posicionados horizontalmente a la derecha del elemento de referencia. Compara coordenadas X seleccionando elementos cuya posición izquierda es mayor que la posición derecha del elemento de referencia.
@Test
void testToRightOfMethod() {
WebElement usernameLabel = driver.findElement(By.xpath("//label[text()='Usuario:']"));
// Buscar el campo de entrada que está a la derecha de la etiqueta
WebElement usernameInput = driver.findElement(
RelativeLocator.with(By.tagName("input"))
.toRightOf(usernameLabel)
);
usernameInput.sendKeys("nombre_usuario");
}
La aplicación práctica de toRightOf()
se evidencia en formularios horizontales donde las etiquetas preceden a los campos de entrada, o en interfaces donde botones de acción se posicionan a la derecha de elementos informativos.
Método near()
El método near()
representa el más flexible de los localizadores relativos, identificando elementos dentro de un radio aproximado de 50 píxeles del elemento de referencia. Este método no considera direcciones específicas, sino proximidad general.
@Test
void testNearMethod() {
WebElement profileImage = driver.findElement(By.className("profile-img"));
// Encontrar el botón de edición cerca de la imagen de perfil
WebElement editButton = driver.findElement(
RelativeLocator.with(By.tagName("button"))
.near(profileImage)
);
editButton.click();
}
El método near()
resulta invaluable en interfaces complejas donde elementos relacionados se agrupan visualmente sin seguir patrones direccionales estrictos. Es particularmente útil para localizar controles auxiliares como botones de ayuda, iconos de información o menús contextuales.
Combinación de métodos
La verdadera versatilidad de los localizadores relativos emerge al combinar múltiples métodos para crear criterios de localización más precisos. Esta aproximación reduce la ambigüedad en interfaces densas donde un solo método podría devolver múltiples candidatos.
@Test
void testCombinedMethods() {
WebElement referenceCell = driver.findElement(By.xpath("//td[text()='Referencia']"));
// Buscar un botón que esté a la derecha Y arriba de la celda de referencia
WebElement actionButton = driver.findElement(
RelativeLocator.with(By.tagName("button"))
.toRightOf(referenceCell)
.above(referenceCell)
);
actionButton.click();
}
Consideraciones de rendimiento
Cada método de localización relativa implica cálculos geométricos que pueden impactar el rendimiento de las pruebas. Los métodos direccionales (above()
, below()
, toLeftOf()
, toRightOf()
) tienden a ser más eficientes que near()
, ya que pueden descartar candidatos más rápidamente basándose en coordenadas específicas.
La estrategia óptima consiste en combinar localizadores relativos con selectores base específicos que limiten el conjunto inicial de elementos candidatos, reduciendo así el número de cálculos geométricos necesarios.
// Más eficiente: selector base específico
WebElement element = driver.findElement(
RelativeLocator.with(By.className("form-input"))
.above(referenceElement)
);
// Menos eficiente: selector base amplio
WebElement element = driver.findElement(
RelativeLocator.with(By.tagName("*"))
.above(referenceElement)
);
Aprendizajes de esta lección de Selenium
- Comprender qué son los localizadores relativos y su propósito en Selenium 4.
- Aprender la sintaxis básica y estructura para utilizar localizadores relativos.
- Conocer los métodos principales: above(), below(), toLeftOf(), toRightOf() y near().
- Aplicar localizadores relativos en casos prácticos como formularios y tablas dinámicas.
- Identificar limitaciones y consideraciones de rendimiento al usar localizadores relativos.
Completa este curso de Selenium y certifícate
Únete a nuestra plataforma de cursos de programación y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.
Asistente IA
Resuelve dudas al instante
Ejercicios
Practica con proyectos reales
Certificados
Valida tus conocimientos
Más de 25.000 desarrolladores ya se han certificado con CertiDevs