Tutorial de Selenium básico: de cero a buenas prácticas

Última actualización: octubre 26, 2025
  • Selenium reúne WebDriver, IDE y Grid para automatizar navegadores con múltiples lenguajes y sistemas.
  • Las buenas prácticas (POM, localizadores robustos y esperas por condición) reducen pruebas inestables.
  • Selenium 4 aporta localizadores relativos y mejor integración con capacidades del navegador.
  • Parasoft Selenic acelera con grabadora, autorreparación y selección de pruebas para CI/CD.

imagen genérica sobre tutorial de Selenium

Si estás buscando una guía clara para empezar con Selenium y no sabes por dónde tirar, aquí tienes un recorrido ordenado y con trucos prácticos para ponerte en marcha sin agobios. Vas a entender qué es Selenium, cómo prepararte, cómo escribir tus primeras pruebas y cómo endurecerlas para que no se rompan a la mínima.

A lo largo del texto verás desde conceptos esenciales (HTML/CSS, localizadores, esperas) hasta buenas prácticas como el Page Object Model, además de herramientas y estrategias para que tus pruebas sean estables incluso cuando la aplicación cambia. También repasaremos Selenium IDE, WebDriver y Grid, su historia, pros y contras, y un ejemplo de caso real que puedes automatizar.

¿Qué es Selenium y por qué tanta gente lo usa?

Selenium es un conjunto de herramientas de automatización de pruebas de código abierto para navegadores. Con una única API permite escribir scripts en múltiples lenguajes (Java, C#, Python, Ruby, JavaScript, entre otros) y ejecutarlos en navegadores modernos como Chrome, Firefox o Edge, y en sistemas operativos variados. Su versatilidad, la comunidad y el soporte multiplataforma lo han convertido en la referencia para pruebas web.

Dentro del proyecto conviven tres piezas principales con funciones distintas: Selenium WebDriver (la API para automatizar navegadores con código), Selenium IDE (extensión de navegador para grabar y reproducir pruebas) y Selenium Grid (ejecución distribuida y en paralelo). Entender la diferencia entre IDE y WebDriver es clave: la grabación ayuda a empezar, pero el desarrollo serio se hace con WebDriver.

Un vistazo a su historia

El origen de Selenium se remonta a 2004 en ThoughtWorks, cuando Jason Huggins creó un framework para probar una aplicación interna de tiempos y gastos. Pronto otros ingenieros vieron el potencial y el proyecto evolucionó, pasando por etapas como Driven Selenium y, más tarde, Selenium Remote Control (RC).

En 2006 llegó Selenium IDE como complemento de Firefox (hoy también en Chrome), lo que permitió grabar y reproducir interacciones. Entre 2007 y 2009 Simon Stewart desarrolló WebDriver y se decidió fusionarlo con RC, dando lugar a Selenium 2.0 (WebDriver). En 2008, además, nació Selenium Grid para ejecutar pruebas en paralelo en múltiples nodos.

Con el tiempo RC quedó obsoleto y en 2016 se consolidó el uso de WebDriver. Con Selenium 3 se afianzó el estándar W3C, y Selenium 4 trajo novedades como los localizadores relativos y mejor integración con capacidades del navegador (autenticación en Chromium/Firefox, interceptación de red, espera por cambios en el DOM o acceso a errores de JavaScript).

Ventajas y por qué es tan popular

La automatización con Selenium acelera las pruebas, aumenta la cobertura y reduce errores humanos repetitivos. Permite ejecutar suites en paralelo (con Grid), integrarse con frameworks como JUnit o TestNG, y adaptarse a flujos complejos o datos dinámicos en la web.

Al ser de código abierto, no hay licencias y puedes ajustarlo a tus necesidades, con una comunidad muy activa. Su gran compatibilidad (navegadores, sistemas, lenguajes) y la reutilización de código lo convierten en una apuesta segura para QA y DevOps.

Habilidades y fundamentos que te facilitan la vida

Antes de ponerte a automatizar, conviene dominar lo básico del front: HTML y CSS. Debes sentirte cómodo inspeccionando el DOM con las herramientas de desarrollador del navegador y comprendiendo cómo ese código se traduce en lo que ves. Cuanto más entiendas el DOM, más fácil localizarás elementos y evitarás localizadores frágiles.

El segundo pilar es el uso de DevTools y estrategias de localización. Con Selenium WebDriver localizarás elementos por id, name, clase, etiqueta o texto de enlace, y cuando la cosa se complica, por selectores CSS o XPath. Entrenar el ojo con el inspector y practicar XPaths robustos es una inversión que ahorra tiempo a futuro.

Si vienes de pruebas manuales, no te asustes: escribir el código de automatización suele ser directo y muy guiado por la API y puede acelerarse con herramientas como GitHub Copilot. Si eliges Java, aprender también JUnit es muy útil para estructurar casos, aserciones y suites. En otros lenguajes encontrarás equivalentes similares.

Preparando el entorno: lenguaje, IDE y dependencias

Elige un lenguaje en el que te sientas cómodo; Java es una opción habitual, pero Python o C# también son muy populares. Trabajar con un IDE maduro como Eclipse o IntelliJ (en Java) te ayuda con la refactorización y el autocompletado, acelerando el desarrollo y el mantenimiento.

Para gestionar dependencias y tareas habituales de compilación y test, Maven en Java facilita muchísimo la vida y se complementa con la automatización de flujos de trabajo en el IDE. Aunque muchos tutoriales lo dejan para más adelante, empezar desde el principio con Maven evita migraciones posteriores del proyecto. Configura las dependencias de Selenium, JUnit/TestNG y el driver del navegador (por ejemplo, ChromeDriver) en tu pom.xml y adelantarás trabajo.

Tu primer script con Selenium WebDriver

La primera prueba típica abre un navegador, navega a una URL, interactúa con la página y valida un resultado. En Java, combinar WebDriver con JUnit permite organizar el ciclo setUp/tearDown y las aserciones de forma limpia.

Un flujo de arranque podría ser: inicializar el driver, visitar la página, localizar un campo por id y escribir, hacer clic en un botón por su selector CSS y verificar un texto esperado con una aserción. Una vez te funcione el “hola mundo” de pruebas, refactoriza la estructura al formato de pruebas del framework elegido para mejorar legibilidad y ejecución.

Diseño escalable: Page Object Model y Page Factory

Pasado el primer guion, el siguiente paso natural es el Page Object Model (POM). Se trata de encapsular la lógica de interacción con cada página en clases dedicadas, separando “qué se prueba” de “cómo se opera la página”. Así reduces duplicidad de locators y haces el mantenimiento mucho más llevadero.

Sobre POM, el patrón Page Factory ayuda a inicializar y optimizar localizadores, simplificando el código. Puede parecer trabajo extra al principio, pero cuando acumulas decenas o cientos de pruebas, la reutilización te ahorra un tiempo brutal. Herramientas como Parasoft Selenic incluso promueven POM/Factory desde su grabadora para ordenar los scripts desde el minuto uno.

Estrategias de localización: de lo simple a lo avanzado

Selenium ofrece siete mecanismos principales para localizar elementos: By.id(), By.name(), By.tagName(), By.className(), By.linkText(), By.partialLinkText(), By.cssSelector() y By.xpath(). Empieza siempre por lo más estable (id, name) y recurre a CSS o XPath cuando sea necesario.

Evita XPaths absolutos que recorren el DOM entero porque se rompen con cualquier cambio. Prefiere XPaths relativos y expresivos combinando atributos y funciones como contains(). Por ejemplo, en lugar de un path largo y frágil, usa algo del estilo: //p. Este enfoque resiste mejor cambios de estructura.

Con Selenium 4 llegaron los localizadores relativos, muy útiles cuando es difícil apuntar a un elemento concreto. Puedes expresar relaciones espaciales humanas: RelativeLocator.with(By.tagName("input")).above(By.id("password")), ...below(...), ...toLeftOf(...), ...toRightOf(...). Son una gran ayuda cuando faltan atributos únicos.

Si te cuesta construir buenos XPaths, existen extensiones de navegador que sugieren rutas, como TruePath para Chrome y Firefox. No es infalible, pero te da puntos de partida que puedes ajustar. Recuerda revisar siempre que el XPath sea estable y legible.

Esperas, AJAX y sincronización inteligente

Un clásico: haces clic en “Añadir al carrito” y en milisegundos tu script va a “Ver carrito”, pero el backend aún no terminó la llamada AJAX y el carrito aparece vacío. Las esperas implícitas o explícitas básicas no siempre bastan para escenarios asincrónicos.

Una estrategia eficaz cuando tu app usa jQuery es consultar su estado desde JavaScript ejecutado por WebDriver: return (window.jQuery && jQuery.active === 0). Si jQuery está presente y no hay llamadas activas, es buena señal para continuar. Complementa con esperas explícitas (WebDriverWait) sobre condiciones del DOM concretas para afinar la sincronización.

Gestionar el cambio: cómo mantener pruebas estables

En la web todo cambia: clases CSS, jerarquías de contenedores, textos… y tus pruebas sufren. Cuando una ejecución falla, necesitas distinguir si es un fallo de prueba, un problema del entorno, un cambio inocuo en la UI o un bug real. Es normal encontrar falsas alarmas; el truco es reducir su frecuencia con buenas prácticas.

Al escribir localizadores, huye de rutas absolutas y apuesta por atributos significativos, selectores CSS sólidos o XPaths relativos combinados con texto o ids estables. Por ejemplo, evita algo como /html/body/div/div/p y prefiere //p junto con un id cuando sea posible. También endurece las esperas: sincroniza con condiciones del DOM o con el estado de AJAX si aplica.

Parasoft Selenic como acelerador del trabajo con Selenium

Además del ecosistema base, existen herramientas que potencian Selenium. Parasoft Selenic ofrece varias funciones interesantes: una grabadora inteligente de UI que genera scripts y los organiza con POM, lo que favorece el mantenimiento desde el principio. Para equipos que arrancan o que quieren industrializar más rápido, es una ayuda útil.

En ejecución, Selenic aplica heurísticas con IA para identificar si una caída parece una regresión real o un síntoma de inestabilidad, incluyendo capacidades de “autorreparación” de localizadores y esperas sobre la marcha. Después, te muestra qué modificó y por qué. Esto reduce ruido y acelera el diagnóstico.

Otra función es la selección inteligente de pruebas: en lugar de correr todo el set, prioriza solo las pruebas afectadas por cambios de código entre builds mediante análisis de impacto. Resultado: feedback más rápido en tu pipeline de CI/CD y ahorro de minutos (o horas).

Por último, Selenic se integra con Maven para una configuración de proyecto fluida y permite orquestar ejecuciones en secuencia o en paralelo. Si tu flujo ya usa Maven, la adopción es natural.

Selenium Grid y la ejecución en paralelo

Selenium Grid permite distribuir la ejecución en varios nodos y navegadores simultáneamente. Consta de un hub (que coordina) y múltiples nodos (que ejecutan). Es vital para reducir tiempos cuando la suite crece y para validar compatibilidad entre navegadores/sistemas.

Si no quieres montar infraestructura propia, existen servicios en la nube (por ejemplo, LambdaTest) que proporcionan granja de navegadores lista para usar. Así escalas sin gestionar máquinas, pagas por uso y te centras en el valor de las pruebas.

Tipos de pruebas que encajan bien con Selenium

Dentro de las pruebas funcionales, la automatización de UI permite simular interacciones reales: rellenar formularios, hacer clic en botones, elegir en desplegables o validar que aparece un texto esperado. Es el terreno natural de Selenium.

Las pruebas de regresión son otro gran candidato: cuando el producto cambia constantemente, necesitas asegurar que lo que funcionaba sigue funcionando. Automatizar reduce tiempos y acelera entregas.

Con las pruebas de compatibilidad verificas que la aplicación se comporta correctamente en distintas combinaciones de SO y navegadores. Con Selenium y Grid este escenario es especialmente abordable.

Las pruebas end-to-end validan flujos completos (búsqueda, registro, pago, consultas, etc.). Idealmente se combinan con pruebas de servicio y unitarias para detectar problemas antes, pero Selenium aporta la visión del usuario final.

Cómo elegir la herramienta adecuada dentro de Selenium

Selenium IDE es perfecto si estás empezando, tienes poca experiencia en programación o necesitas generar casos simples rápido. Permite grabar, editar, depurar y exportar a varios lenguajes, e incluso ejecutar JavaScript personalizado con runScript. Su ámbito natural es Chrome y Firefox.

Si necesitas control fino, integración con frameworks de pruebas y desarrollo sostenible, elige Selenium WebDriver. Sirve para datos dinámicos, flujos con AJAX y personalizar reporting. Además, es el camino para integrar con Grid y CI/CD.

Cuando la prioridad es acortar tiempos y cubrir combinaciones de entornos, Selenium Grid entra en juego. Ideal para grandes suites y pipelines de entrega continua que requieren paralelizar.

Ejemplo de caso real: alta de usuario

Imagina que quieres verificar el registro de usuarios en una web. El objetivo es asegurar que las validaciones funcionan y que, con datos válidos, se muestra la pantalla de bienvenida. Este patrón es muy común y rentable de automatizar.

Pasos típicos del caso: 1) Abrir la URL de registro. 2) Introducir datos inválidos en email, usuario y contraseña y verificar que aparecen los mensajes de error adecuados. 3) Confirmar que las validaciones (expresiones regulares, duplicados en BD) se aplican. 4) Introducir datos correctos y pulsar “Registrarse”. 5) Comprobar que aparece la página de bienvenida con el nombre. 6) Marcar la prueba como aprobada o fallida según el comportamiento observado.

Este mismo flujo debe repetirse en navegadores y sistemas distintos; manualmente te puede consumir días. Con Selenium reduces el esfuerzo y estandarizas la verificación, dejando el trabajo repetitivo a la máquina.

Localizadores en detalle y ejemplos prácticos

Localizadores simples y rápidos: By.id() (atributo id), By.name() (atributo name), By.tagName() (por etiqueta, p. ej. input), By.className() (clase CSS), y By.linkText()/By.partialLinkText() (texto exacto o parcial en enlaces). Úsalos siempre que haya atributos únicos y estables.

Localizadores avanzados: By.cssSelector() y By.xpath() para escenarios en los que los atributos no son únicos o necesitas navegar jerarquías. Con CSS puedes componer selectores por clase, atributo o posición; con XPath tienes potencia para expresar condiciones complejas y búsquedas relativas.

Ejemplos de localizadores relativos en Selenium 4: RelativeLocator.with(By.tagName("label")).above(By.id("email")), RelativeLocator.with(By.tagName("button")).toRightOf(By.id("cancelar")), RelativeLocator.with(By.tagName("input")).below(By.id("usuario")). Te ayudan cuando falta un id o clase fiable.

Esperas bien aplicadas: menos flaky, más valor

Para sincronización, combina esperas explícitas (esperar a que un elemento sea visible, clickable, que un atributo tenga un valor) con validaciones del estado de la aplicación. En entornos con AJAX, comprobar que no hay peticiones pendientes de jQuery es un buen “semáforo” para pasar al siguiente paso.

No caigas en el “sleep por si acaso”: si sobreestimas tiempos, tus pruebas irán lentas; si te quedas corto, fallarán de forma intermitente. La clave es esperar por condiciones, no por segundos fijos, y encapsular esas esperas en utilidades reutilizables.

Pros y contras de trabajar con Selenium

Entre las ventajas, destacan: multiplataforma, multilenguaje y multinavegador; ejecución en paralelo con Grid; código abierto (sin licencias); integración con ecosistema de testing y CI/CD; y gran documentación y comunidad. Además, puedes reutilizar mucho código entre escenarios y navegadores.

En el lado menos amable: no cubre por sí mismo aplicaciones de escritorio ni móviles (para mobile, Appium es la alternativa habitual); los informes avanzados requieren integraciones externas; la infraestructura (especialmente Grid) necesita mantenimiento; y se requieren conocimientos de programación para sacarle partido. Todo esto es manejable, pero hay que contarlo.

Buenas prácticas rápidas para endurecer tus pruebas

– Prioriza id/name, luego CSS y deja XPath para cuando de verdad aporte valor. Si usas XPath, que sea relativo y expresivo.

– Centraliza localizadores en POM; evita repetirlos por todo el código. Un solo cambio en POM corrige toda la suite.

– Aísla datos de prueba y usa factorización (builders, fixtures) para legibilidad.

– Usa esperas explícitas por condición, evita sleeps fijos. Sincroniza con el DOM o con el estado AJAX.

– Paraleliza en Grid cuando la suite crezca; integra pronto en CI/CD.

Con todo lo anterior ya tienes una hoja de ruta completa: comprender qué es Selenium y sus piezas, montar tu entorno con Maven y un buen IDE, escribir el primer script y después refactorizar a POM, mejorar localizadores y esperas, y escalar con Grid o apoyarte en herramientas como Parasoft Selenic para acelerar y estabilizar. Con práctica, pasarás de pruebas frágiles a una batería sólida que te dé confianza en cada entrega.

Gemini CLI GitHub Actions
Artículo relacionado:
Todo sobre Gemini CLI GitHub Actions: Automación inteligente para desarrolladores