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 PlusLocalizadores 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.
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