Localizadores tradicionales

Intermedio
Selenium
Selenium
Actualizado: 05/09/2025

¡Desbloquea el curso de Selenium completo!

IA
Ejercicios
Certificado
Entrar

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 Plus

Localizadores id, name y className

Los localizadores fundamentales de Selenium representan la base de cualquier estrategia de automatización web eficaz. Estos tres métodos constituyen el núcleo de la localización de elementos debido a su simplicidad, velocidad y confiabilidad en la mayoría de escenarios de pruebas.

La clase By de Selenium proporciona métodos estáticos que generan estrategias de localización optimizadas para el motor del navegador. Cada localizador tiene características específicas que los hacen más adecuados para diferentes tipos de elementos HTML.

By.id() - El localizador más eficiente

El localizador By.id() representa la estrategia más rápida y confiable para encontrar elementos web. Los navegadores indexan automáticamente los elementos por su atributo id, convirtiendo estas búsquedas en operaciones de acceso directo.

@Test
void testLoginFormById() {
    // HTML: <input id="username" type="text" name="user">
    WebElement usernameField = driver.findElement(By.id("username"));
    usernameField.sendKeys("admin");
    
    // HTML: <button id="login-btn" class="primary-button">Iniciar sesión</button>
    WebElement loginButton = driver.findElement(By.id("login-btn"));
    loginButton.click();
}

El rendimiento superior de By.id() se debe a que los identificadores únicos permiten al navegador localizar elementos sin recorrer el DOM completo. Esta característica lo convierte en la primera opción cuando el elemento posee un id estable y único.

By.name() - Ideal para formularios

El localizador By.name() resulta especialmente útil en formularios web, donde el atributo name identifica campos de entrada para el procesamiento del lado del servidor. Este método ofrece un equilibrio óptimo entre velocidad y semántica.

@Test
void testRegistrationForm() {
    // HTML: <input name="email" type="email" placeholder="Correo electrónico">
    WebElement emailInput = driver.findElement(By.name("email"));
    emailInput.sendKeys("usuario@ejemplo.com");
    
    // HTML: <input name="password" type="password">
    WebElement passwordInput = driver.findElement(By.name("password"));
    passwordInput.sendKeys("contraseñaSegura123");
    
    // HTML: <select name="country">
    WebElement countrySelect = driver.findElement(By.name("country"));
    countrySelect.click();
}

Los atributos name mantienen estabilidad a lo largo del tiempo porque están vinculados a la lógica de negocio de la aplicación. Los desarrolladores raramente modifican estos valores sin considerar el impacto en el procesamiento de datos.

By.className() - Localización por estilos CSS

El localizador By.className() permite encontrar elementos basándose en sus clases CSS. Este método es particularmente útil cuando necesitamos localizar elementos que comparten características visuales o funcionales similares.

@Test
void testNavigationMenu() {
    // HTML: <nav class="main-navigation">
    WebElement mainNav = driver.findElement(By.className("main-navigation"));
    
    // HTML: <button class="btn-primary">Guardar</button>
    WebElement saveButton = driver.findElement(By.className("btn-primary"));
    saveButton.click();
    
    // HTML: <div class="error-message">Campo requerido</div>
    WebElement errorMessage = driver.findElement(By.className("error-message"));
    String errorText = errorMessage.getText();
}

Es importante recordar que By.className() busca la clase exacta especificada. Si un elemento tiene múltiples clases como class="btn btn-primary large", debemos usar una sola clase que identifique únicamente el elemento.

Consideraciones de rendimiento y estrategia

La jerarquía de eficiencia de estos localizadores sigue un patrón claro: By.id() ofrece el mejor rendimiento, seguido de By.name() y finalmente By.className(). Esta diferencia se acentúa en páginas con estructuras DOM complejas.

@Test
void testPerformanceComparison() {
    // Más rápido - Acceso directo por índice del navegador
    WebElement fastElement = driver.findElement(By.id("unique-identifier"));
    
    // Velocidad media - Búsqueda optimizada por navegador
    WebElement mediumElement = driver.findElement(By.name("form-field"));
    
    // Más lento - Recorrido de elementos con clases CSS
    WebElement slowElement = driver.findElement(By.className("styled-component"));
}

Gestión de elementos múltiples

Cuando necesitamos trabajar con múltiples elementos que comparten el mismo localizador, especialmente con By.className() y By.name(), utilizamos findElements() que retorna una lista de elementos coincidentes.

@Test
void testMultipleElements() {
    // HTML: <input name="preferences" type="checkbox" value="email">
    //       <input name="preferences" type="checkbox" value="sms">
    //       <input name="preferences" type="checkbox" value="push">
    List<WebElement> preferences = driver.findElements(By.name("preferences"));
    
    preferences.stream()
        .filter(checkbox -> checkbox.getAttribute("value").equals("email"))
        .findFirst()
        .ifPresent(WebElement::click);
}

Limitaciones y casos especiales

Cada localizador presenta limitaciones específicas que debemos considerar en nuestras estrategias de pruebas. Los elementos sin id requieren alternativas, los atributos name pueden no existir fuera de formularios, y las clases CSS pueden cambiar frecuentemente durante el desarrollo de interfaces.

@Test
void testFallbackStrategy() {
    WebElement element;
    
    // Estrategia preferida
    try {
        element = driver.findElement(By.id("target-element"));
    } catch (NoSuchElementException e) {
        // Estrategia alternativa
        try {
            element = driver.findElement(By.name("target-field"));
        } catch (NoSuchElementException ex) {
            // Última opción
            element = driver.findElement(By.className("target-component"));
        }
    }
}

La estabilidad de estos localizadores depende directamente de las prácticas de desarrollo del equipo. Los identificadores y nombres suelen mantenerse estables, mientras que las clases CSS pueden modificarse con mayor frecuencia durante actualizaciones de diseño.

Localizadores linkText, partialLinkText, tagName

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.

Progreso guardado
Asistente IA
Ejercicios
Iniciar sesión gratis

Más de 25.000 desarrolladores ya confían en CertiDevs

Los localizadores especializados de Selenium extienden las capacidades de localización más allá de los atributos básicos, proporcionando estrategias específicas para elementos con características particulares. Estos métodos resultan especialmente útiles cuando trabajamos con enlaces de navegación, contenido dinámico o cuando necesitamos localizar elementos por su tipo HTML.

By.linkText() - Localización exacta de enlaces

El localizador By.linkText() encuentra elementos de enlace (<a>) basándose en su texto visible completo. Este método ofrece una localización semántica que resulta intuitiva tanto para desarrolladores como para usuarios finales.

@Test
void testNavigationLinks() {
    // HTML: <a href="/productos">Nuestros Productos</a>
    WebElement productLink = driver.findElement(By.linkText("Nuestros Productos"));
    productLink.click();
    
    // HTML: <a href="/contacto">Contactar con nosotros</a>
    WebElement contactLink = driver.findElement(By.linkText("Contactar con nosotros"));
    String linkUrl = contactLink.getAttribute("href");
}

La coincidencia exacta del texto es fundamental con este localizador. Espacios adicionales, diferencias en mayúsculas o caracteres especiales harán que la búsqueda falle, requiriendo una correspondencia perfecta entre el texto buscado y el contenido del enlace.

@Test
void testLinkTextCaseSensitivity() {
    // HTML: <a href="/inicio">Página de Inicio</a>
    
    // Correcto - coincidencia exacta
    WebElement homeLink = driver.findElement(By.linkText("Página de Inicio"));
    
    // Incorrecto - diferente capitalización
    // driver.findElement(By.linkText("página de inicio")); // NoSuchElementException
    
    // Incorrecto - texto parcial
    // driver.findElement(By.linkText("Página")); // NoSuchElementException
}

By.partialLinkText() - Búsqueda flexible de enlaces

El localizador By.partialLinkText() ofrece mayor flexibilidad al buscar enlaces que contengan el texto especificado como subcadena. Esta estrategia resulta especialmente útil cuando el texto completo del enlace es muy largo o puede variar dinámicamente.

@Test
void testPartialLinkText() {
    // HTML: <a href="/descargas">Descargar documento PDF (versión 2.1)</a>
    WebElement downloadLink = driver.findElement(By.partialLinkText("Descargar documento"));
    downloadLink.click();
    
    // HTML: <a href="/usuario/perfil">Ver perfil completo del usuario</a>
    WebElement profileLink = driver.findElement(By.partialLinkText("Ver perfil"));
    String profileUrl = profileLink.getAttribute("href");
}

La búsqueda parcial permite crear pruebas más robustas cuando el contenido de los enlaces incluye información dinámica como fechas, versiones o datos específicos del usuario.

@Test
void testDynamicLinkContent() {
    // HTML: <a href="/pedido/12345">Pedido #12345 - Completado el 15/01/2025</a>
    WebElement orderLink = driver.findElement(By.partialLinkText("Pedido #12345"));
    
    // HTML: <a href="/informe">Informe mensual - Enero 2025 (PDF)</a>
    WebElement reportLink = driver.findElement(By.partialLinkText("Informe mensual"));
    reportLink.click();
}

By.tagName() - Localización por tipo de elemento

El localizador By.tagName() encuentra elementos basándose en su etiqueta HTML. Este método resulta útil cuando necesitamos localizar elementos por su función estructural en lugar de por atributos específicos.

@Test
void testTagNameLocator() {
    // Localizar el primer formulario en la página
    WebElement form = driver.findElement(By.tagName("form"));
    
    // Localizar la primera tabla
    WebElement table = driver.findElement(By.tagName("table"));
    
    // Localizar el primer párrafo
    WebElement paragraph = driver.findElement(By.tagName("p"));
    String paragraphText = paragraph.getText();
}

La localización por etiqueta es especialmente útil cuando combinamos múltiples elementos del mismo tipo o cuando necesitamos validar la estructura general de una página.

@Test
void testMultipleTagElements() {
    // Obtener todas las imágenes de la página
    List<WebElement> images = driver.findElements(By.tagName("img"));
    
    long imagesWithAltText = images.stream()
        .filter(img -> !img.getAttribute("alt").isEmpty())
        .count();
    
    // Validar que todas las imágenes tienen texto alternativo
    assertEquals(images.size(), imagesWithAltText, 
        "Todas las imágenes deben tener atributo alt");
}

Combinación estratégica de localizadores

Los localizadores de enlaces y etiquetas funcionan especialmente bien cuando se combinan con otros métodos para crear estrategias de localización más específicas y confiables.

@Test
void testCombinedLocatorStrategy() {
    // Localizar tabla de resultados y luego sus enlaces
    WebElement resultsTable = driver.findElement(By.tagName("table"));
    List<WebElement> tableLinks = resultsTable.findElements(By.tagName("a"));
    
    // Filtrar enlaces por texto parcial
    WebElement editLink = tableLinks.stream()
        .filter(link -> link.getText().contains("Editar"))
        .findFirst()
        .orElseThrow(() -> new NoSuchElementException("Enlace de edición no encontrado"));
        
    editLink.click();
}

Limitaciones y consideraciones especiales

Los localizadores de texto de enlace presentan vulnerabilidades específicas relacionadas con cambios en el contenido. Las modificaciones en textos, traducciones o actualizaciones de contenido pueden quebrar estas pruebas fácilmente.

@Test
void testLinkTextStability() {
    try {
        // Intento con texto completo
        WebElement link = driver.findElement(By.linkText("Ir al panel de administración"));
        link.click();
    } catch (NoSuchElementException e) {
        // Alternativa con texto parcial
        WebElement fallbackLink = driver.findElement(By.partialLinkText("panel de administración"));
        fallbackLink.click();
    }
}

El localizador By.tagName() requiere especial cuidado cuando existen múltiples elementos del mismo tipo. En estos casos, findElement() retorna únicamente el primer elemento encontrado en el orden del DOM.

@Test
void testTagNameWithMultipleElements() {
    // HTML: <h1>Título principal</h1>
    //       <h2>Subtítulo</h2>
    //       <h2>Otro subtítulo</h2>
    
    WebElement mainHeading = driver.findElement(By.tagName("h1"));
    WebElement firstSubheading = driver.findElement(By.tagName("h2")); // Solo el primero
    
    // Para obtener todos los h2
    List<WebElement> allSubheadings = driver.findElements(By.tagName("h2"));
    assertEquals(2, allSubheadings.size());
}

Casos de uso recomendados

La estrategia óptima para estos localizadores depende del contexto específico de la aplicación. By.linkText() funciona mejor en aplicaciones con contenido estático, mientras que By.partialLinkText() se adapta mejor a contenido dinámico. By.tagName() resulta ideal para validaciones estructurales y localización de contenedores.

@Test
void testOptimalUseCases() {
    // Navegación estática - linkText
    driver.findElement(By.linkText("Acerca de nosotros")).click();
    
    // Contenido dinámico - partialLinkText
    driver.findElement(By.partialLinkText("Usuario:")).click();
    
    // Validación estructural - tagName
    List<WebElement> forms = driver.findElements(By.tagName("form"));
    assertTrue(forms.size() > 0, "La página debe contener al menos un formulario");
}

Aprendizajes de esta lección de Selenium

  • Comprender el uso y ventajas de los localizadores By.id(), By.name() y By.className() en Selenium.
  • Aprender a localizar enlaces mediante By.linkText() y By.partialLinkText() para textos completos y parciales.
  • Entender la utilidad de By.tagName() para localizar elementos por su etiqueta HTML.
  • Analizar las consideraciones de rendimiento y limitaciones de cada localizador.
  • Aplicar estrategias combinadas y de fallback para mejorar la robustez de las pruebas automatizadas.

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

⭐⭐⭐⭐⭐
4.9/5 valoración