Interacción con elementos

Intermedio
Selenium
Selenium
Actualizado: 05/09/2025

Operaciones básicas

Una vez que hemos localizado elementos en el DOM, el siguiente paso natural es interactuar con ellos de manera efectiva. Las operaciones básicas de Selenium WebDriver nos proporcionan las herramientas fundamentales para simular las acciones que un usuario real realizaría en una aplicación web.

Estas operaciones constituyen la base de cualquier automatización de pruebas y se dividen en dos categorías principales: acciones de modificación (click, sendKeys, clear) y acciones de consulta (getText, getAttribute). Dominar estas operaciones es esencial para construir pruebas robustas y mantenibles.

Operación click()

El método click() simula un clic del ratón sobre un elemento web. Esta operación es fundamental para interactuar con botones, enlaces, checkboxes y cualquier elemento clickeable.

@Test
void deberiaHacerClicEnBoton() {
    WebElement botonEnviar = driver.findElement(By.id("submit-button"));
    botonEnviar.click();
    
    // Verificar que la acción se ejecutó correctamente
    WebElement mensaje = driver.findElement(By.className("success-message"));
    assertThat(mensaje.isDisplayed()).isTrue();
}

La operación click() funciona automáticamente con la mayoría de elementos interactivos. Sin embargo, es importante considerar que algunos elementos pueden requerir scroll hasta ser visibles antes de poder hacer clic en ellos.

@Test
void deberiaHacerClicEnElementoQueRequiereScroll() {
    WebElement elemento = driver.findElement(By.id("bottom-button"));
    
    // Selenium automáticamente hace scroll si es necesario
    elemento.click();
    
    assertThat(driver.getCurrentUrl()).contains("success");
}

Operación sendKeys()

El método sendKeys() permite enviar texto y teclas especiales a elementos de entrada como campos de texto, áreas de texto y campos de contraseña.

@Test
void deberiaIntroducirTextoEnCampo() {
    WebElement campoNombre = driver.findElement(By.name("username"));
    campoNombre.sendKeys("usuario.prueba");
    
    // Verificar que el texto se introdujo correctamente
    assertThat(campoNombre.getAttribute("value")).isEqualTo("usuario.prueba");
}

Una funcionalidad avanzada de sendKeys() es el envío de teclas especiales mediante la clase Keys, útil para simular combinaciones de teclado y teclas de función.

@Test
void deberiaUsarTeclasEspeciales() {
    WebElement campoTexto = driver.findElement(By.id("search-field"));
    campoTexto.sendKeys("selenium webdriver");
    
    // Simular presionar Enter
    campoTexto.sendKeys(Keys.ENTER);
    
    // Simular Ctrl+A para seleccionar todo
    campoTexto.sendKeys(Keys.CONTROL + "a");
}

Operación clear()

El método clear() elimina todo el contenido de un elemento de entrada. Esta operación es especialmente útil cuando necesitamos limpiar campos antes de introducir nuevos valores.

@Test
void deberiaLimpiarYReemplazarTexto() {
    WebElement campoEmail = driver.findElement(By.id("email"));
    
    // Introducir texto inicial
    campoEmail.sendKeys("email.antiguo@ejemplo.com");
    
    // Limpiar el campo
    campoEmail.clear();
    
    // Introducir nuevo texto
    campoEmail.sendKeys("email.nuevo@ejemplo.com");
    
    assertThat(campoEmail.getAttribute("value")).isEqualTo("email.nuevo@ejemplo.com");
}

Es importante tener en cuenta que clear() solo funciona con elementos editables como input y textarea. Si intentamos usar clear() en elementos no editables, la operación será ignorada silenciosamente.

Operación getText()

El método getText() obtiene el texto visible de un elemento. Esta operación devuelve exactamente lo que un usuario vería en la pantalla, excluyendo elementos ocultos.

@Test
void deberiaObtenerTextoVisible() {
    WebElement titulo = driver.findElement(By.tagName("h1"));
    String textoTitulo = titulo.getText();
    
    assertThat(textoTitulo).isEqualTo("Bienvenido a la aplicación");
}

getText() es particularmente útil para validar mensajes y contenido dinámico en las pruebas.

@Test
void deberiaValidarMensajeError() {
    WebElement campoEmail = driver.findElement(By.id("email"));
    WebElement botonEnviar = driver.findElement(By.id("submit"));
    
    // Intentar enviar formulario sin email
    botonEnviar.click();
    
    WebElement mensajeError = driver.findElement(By.className("error-message"));
    String textoError = mensajeError.getText();
    
    assertThat(textoError).contains("El campo email es obligatorio");
}

Operación getAttribute()

El método getAttribute() obtiene el valor de un atributo HTML específico de un elemento. Esta operación es fundamental para acceder a propiedades que no son visibles directamente en la interfaz.

@Test
void deberiaObtenerAtributosDeElemento() {
    WebElement enlace = driver.findElement(By.tagName("a"));
    
    String href = enlace.getAttribute("href");
    String target = enlace.getAttribute("target");
    String clases = enlace.getAttribute("class");
    
    assertThat(href).isEqualTo("https://ejemplo.com");
    assertThat(target).isEqualTo("_blank");
    assertThat(clases).contains("enlace-externo");
}

getAttribute() también puede obtener propiedades de estado de elementos formulario, como el estado checked de checkboxes o el valor actual de campos de entrada.

@Test
void deberiaVerificarEstadoCheckbox() {
    WebElement checkbox = driver.findElement(By.id("terms-checkbox"));
    
    // Verificar estado inicial
    String checkedInicial = checkbox.getAttribute("checked");
    assertThat(checkedInicial).isNull(); // No está marcado
    
    // Hacer clic para marcar
    checkbox.click();
    
    // Verificar nuevo estado
    String checkedFinal = checkbox.getAttribute("checked");
    assertThat(checkedFinal).isEqualTo("true");
}

Combinando operaciones básicas

En escenarios reales, estas operaciones se combinan para crear flujos de interacción completos que simulan el comportamiento real del usuario.

@Test
void deberiaCompletarFormularioLogin() {
    // Localizar elementos
    WebElement campoUsuario = driver.findElement(By.id("username"));
    WebElement campoPassword = driver.findElement(By.id("password"));
    WebElement botonLogin = driver.findElement(By.id("login-button"));
    
    // Limpiar campos por seguridad
    campoUsuario.clear();
    campoPassword.clear();
    
    // Introducir credenciales
    campoUsuario.sendKeys("admin");
    campoPassword.sendKeys("password123");
    
    // Enviar formulario
    botonLogin.click();
    
    // Validar resultado
    WebElement mensajeBienvenida = driver.findElement(By.className("welcome-message"));
    assertThat(mensajeBienvenida.getText()).contains("Bienvenido, admin");
}

Validaciones modernas

Las validaciones en Selenium WebDriver van más allá de simplemente verificar que un elemento existe en el DOM. Los métodos de validación modernos nos permiten comprobar el estado real y la disponibilidad de los elementos antes de interactuar con ellos, evitando errores comunes y mejorando la robustez de nuestras pruebas automatizadas.

Estas validaciones son especialmente importantes en aplicaciones web dinámicas donde los elementos pueden cambiar de estado según las interacciones del usuario, llamadas AJAX, o actualizaciones en tiempo real. Implementar validaciones apropiadas es una práctica fundamental para crear pruebas estables y confiables.

Validación de visibilidad con isDisplayed()

El método isDisplayed() verifica si un elemento es visible para el usuario en la página. Un elemento puede estar presente en el DOM pero no ser visible debido a estilos CSS como display: none o visibility: hidden.

@Test
void deberiaValidarVisibilidadDeElemento() {
    WebElement modalDialog = driver.findElement(By.id("confirmation-modal"));
    
    // Verificar que el modal no es visible inicialmente
    assertThat(modalDialog.isDisplayed()).isFalse();
    
    // Activar modal
    WebElement botonAbrir = driver.findElement(By.id("open-modal"));
    botonAbrir.click();
    
    // Verificar que ahora es visible
    assertThat(modalDialog.isDisplayed()).isTrue();
}

Esta validación es especialmente útil para elementos condicionales que aparecen y desaparecen según el contexto de la aplicación.

@Test
void deberiaValidarMensajeErrorCondicional() {
    WebElement campoEmail = driver.findElement(By.id("email"));
    WebElement mensajeError = driver.findElement(By.className("email-error"));
    
    // Verificar que el mensaje de error no es visible inicialmente
    assertThat(mensajeError.isDisplayed()).isFalse();
    
    // Introducir email inválido
    campoEmail.sendKeys("email-invalido");
    campoEmail.sendKeys(Keys.TAB); // Trigger validation
    
    // El mensaje de error debe ser visible ahora
    assertThat(mensajeError.isDisplayed()).isTrue();
    assertThat(mensajeError.getText()).contains("Formato de email inválido");
}

Validación de disponibilidad con isEnabled()

El método isEnabled() determina si un elemento está habilitado para interacción. Un elemento puede estar visible pero deshabilitado, lo que impediría que el usuario interactúe con él normalmente.

@Test
void deberiaValidarEstadoHabilitadoDeBoton() {
    WebElement botonEnviar = driver.findElement(By.id("submit-button"));
    WebElement checkboxTerminos = driver.findElement(By.id("terms-checkbox"));
    
    // Verificar que el botón está deshabilitado inicialmente
    assertThat(botonEnviar.isEnabled()).isFalse();
    
    // Aceptar términos y condiciones
    checkboxTerminos.click();
    
    // El botón debe habilitarse ahora
    assertThat(botonEnviar.isEnabled()).isTrue();
}

Esta validación es crucial en formularios dinámicos donde ciertos campos o botones se habilitan basándose en la entrada del usuario.

@Test
void deberiaValidarHabilitacionCondicionalDeCampos() {
    WebElement tipoUsuario = driver.findElement(By.id("user-type"));
    WebElement campoEmpresa = driver.findElement(By.id("company-field"));
    
    // Verificar estado inicial
    assertThat(campoEmpresa.isEnabled()).isFalse();
    
    // Seleccionar tipo de usuario empresarial
    Select select = new Select(tipoUsuario);
    select.selectByValue("business");
    
    // El campo empresa debe habilitarse
    assertThat(campoEmpresa.isEnabled()).isTrue();
}

Validación de selección con isSelected()

El método isSelected() verifica si un elemento está seleccionado. Este método es aplicable principalmente a checkboxes, radio buttons y opciones de elementos select.

@Test
void deberiaValidarSeleccionDeCheckbox() {
    WebElement newsletterCheckbox = driver.findElement(By.id("newsletter-subscription"));
    
    // Verificar estado inicial
    assertThat(newsletterCheckbox.isSelected()).isFalse();
    
    // Seleccionar checkbox
    newsletterCheckbox.click();
    
    // Verificar que está seleccionado
    assertThat(newsletterCheckbox.isSelected()).isTrue();
    
    // Deseleccionar
    newsletterCheckbox.click();
    assertThat(newsletterCheckbox.isSelected()).isFalse();
}

Para radio buttons, isSelected() es especialmente útil para verificar que solo una opción está seleccionada en un grupo.

@Test
void deberiaValidarSeleccionExclusivaDeRadioButtons() {
    List<WebElement> opcionesPago = driver.findElements(By.name("payment-method"));
    
    // Verificar que ninguna opción está seleccionada inicialmente
    opcionesPago.forEach(opcion -> 
        assertThat(opcion.isSelected()).isFalse()
    );
    
    // Seleccionar tarjeta de crédito
    WebElement tarjetaCredito = driver.findElement(By.id("credit-card"));
    tarjetaCredito.click();
    
    // Verificar selección exclusiva
    assertThat(tarjetaCredito.isSelected()).isTrue();
    
    // Verificar que otras opciones permanecen no seleccionadas
    opcionesPago.stream()
        .filter(opcion -> !opcion.equals(tarjetaCredito))
        .forEach(opcion -> assertThat(opcion.isSelected()).isFalse());
}

Validaciones combinadas y flujos robustos

En escenarios reales, combinamos múltiples validaciones para crear flujos de verificación completos que aseguran la integridad del estado de la aplicación.

@Test
void deberiaValidarEstadoCompletoDeFormulario() {
    WebElement campoNombre = driver.findElement(By.id("name"));
    WebElement campoEmail = driver.findElement(By.id("email"));
    WebElement checkboxPrivacidad = driver.findElement(By.id("privacy-policy"));
    WebElement botonRegistrar = driver.findElement(By.id("register-button"));
    
    // Validar estado inicial del formulario
    assertThat(campoNombre.isDisplayed()).isTrue();
    assertThat(campoNombre.isEnabled()).isTrue();
    assertThat(checkboxPrivacidad.isSelected()).isFalse();
    assertThat(botonRegistrar.isEnabled()).isFalse();
    
    // Completar formulario paso a paso
    campoNombre.sendKeys("Juan Pérez");
    campoEmail.sendKeys("juan@ejemplo.com");
    
    // El botón aún debe estar deshabilitado
    assertThat(botonRegistrar.isEnabled()).isFalse();
    
    // Aceptar política de privacidad
    checkboxPrivacidad.click();
    
    // Validar estado final
    assertThat(checkboxPrivacidad.isSelected()).isTrue();
    assertThat(botonRegistrar.isEnabled()).isTrue();
}

Validación previa a interacciones críticas

Una buena práctica fundamental es validar el estado de los elementos antes de realizar interacciones críticas, especialmente en aplicaciones con comportamiento asíncrono.

@Test
void deberiaValidarAntesDeInteractuar() {
    WebElement botonDescargar = driver.findElement(By.id("download-button"));
    
    // Validar que el elemento está listo para interacción
    if (botonDescargar.isDisplayed() && botonDescargar.isEnabled()) {
        botonDescargar.click();
        
        // Validar resultado de la interacción
        WebElement mensajeDescarga = driver.findElement(By.className("download-started"));
        assertThat(mensajeDescarga.isDisplayed()).isTrue();
    } else {
        fail("El botón de descarga no está disponible para interacción");
    }
}

Manejo de elementos con estados dinámicos

En aplicaciones modernas con actualizaciones dinámicas, los elementos pueden cambiar de estado frecuentemente. Las validaciones nos ayudan a sincronizar nuestras pruebas con estos cambios.

@Test
void deberiaValidarCambiosDeEstadoDinamicos() {
    WebElement botonProcesar = driver.findElement(By.id("process-button"));
    WebElement indicadorCarga = driver.findElement(By.className("loading-spinner"));
    
    // Estado inicial: botón habilitado, indicador oculto
    assertThat(botonProcesar.isEnabled()).isTrue();
    assertThat(indicadorCarga.isDisplayed()).isFalse();
    
    // Iniciar procesamiento
    botonProcesar.click();
    
    // Durante procesamiento: botón deshabilitado, indicador visible
    assertThat(botonProcesar.isEnabled()).isFalse();
    assertThat(indicadorCarga.isDisplayed()).isTrue();
    
    // Esperar finalización del procesamiento
    WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
    wait.until(driver -> !indicadorCarga.isDisplayed());
    
    // Estado final: botón habilitado, indicador oculto
    assertThat(botonProcesar.isEnabled()).isTrue();
    assertThat(indicadorCarga.isDisplayed()).isFalse();
}

Validaciones con programación funcional moderna

Aprovechando las características de Java moderno, podemos crear validaciones más expresivas y reutilizables utilizando programación funcional.

@Test
void deberiaUsarValidacionesFuncionales() {
    List<WebElement> camposObligatorios = driver.findElements(By.className("required-field"));
    
    // Validar que todos los campos obligatorios están visibles y habilitados
    boolean todosCamposListos = camposObligatorios.stream()
        .allMatch(campo -> campo.isDisplayed() && campo.isEnabled());
    
    assertThat(todosCamposListos).isTrue();
    
    // Contar campos seleccionados
    List<WebElement> checkboxes = driver.findElements(By.cssSelector("input[type='checkbox']"));
    long checkboxesSeleccionados = checkboxes.stream()
        .mapToLong(checkbox -> checkbox.isSelected() ? 1 : 0)
        .sum();
    
    assertThat(checkboxesSeleccionados).isGreaterThan(0);
}

Estas validaciones modernas proporcionan una base sólida para construir pruebas automatizadas que reflejan fielmente el comportamiento real de los usuarios y se adaptan a las características dinámicas de las aplicaciones web contemporáneas.

Fuentes y referencias

Documentación oficial y recursos externos para profundizar en Selenium

Documentación oficial de Selenium
Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Selenium es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Selenium

Explora más contenido relacionado con Selenium y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

  • Comprender y aplicar las operaciones básicas de interacción con elementos web: click, sendKeys, clear, getText y getAttribute.
  • Aprender a validar el estado y la visibilidad de los elementos mediante métodos como isDisplayed, isEnabled e isSelected.
  • Desarrollar flujos de interacción combinando operaciones y validaciones para simular comportamientos reales de usuario.
  • Implementar buenas prácticas para manejar elementos con estados dinámicos y validar antes de interacciones críticas.
  • Utilizar técnicas modernas de programación funcional en Java para realizar validaciones más expresivas y reutilizables.