Control de flujo bucles

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

Bucles while, times y forEach

Los bucles en Selenium IDE permiten repetir secuencias de comandos de forma automática, lo que resulta especialmente útil cuando necesitamos procesar múltiples elementos similares o repetir acciones un número específico de veces. Selenium IDE ofrece tres tipos principales de bucles: times, while y forEach, cada uno diseñado para diferentes escenarios de testing.

Bucle times

El comando times es el más simple de usar cuando conocemos exactamente cuántas veces queremos repetir una secuencia de acciones. Su sintaxis es directa: especificamos el número de repeticiones en el campo Target y cerramos el bucle con end.

Command: times
Target: 3
Value: (vacío)

... comandos a repetir ...

Command: end
Target: (vacío)
Value: (vacío)

Un ejemplo práctico sería hacer clic en un botón "Siguiente" tres veces para navegar por páginas de resultados:

Command: times
Target: 3
Value: 

Command: click
Target: css=button[id="next-page"]
Value: 

Command: waitForElementVisible
Target: css=.page-content
Value: 3000

Command: end
Target: 
Value: 

Este bucle es ideal para casos de testing donde necesitamos repetir una acción un número fijo de veces, como rellenar múltiples formularios idénticos o navegar por un número conocido de páginas.

Bucle while

El comando while ejecuta repetidamente un conjunto de comandos mientras se cumpla una condición específica. Es más flexible que times porque la repetición depende del estado actual de la página, no de un número fijo.

Command: while
Target: ${condición}
Value: (vacío)

... comandos a repetir ...

Command: end
Target: (vacío)
Value: (vacío)

Para usar while efectivamente, necesitamos establecer una variable de control que cambie durante la ejecución del bucle. Por ejemplo, podemos contar elementos visibles y continuar mientras existan:

Command: storeElementCount
Target: css=.item-list li
Value: itemCount

Command: while
Target: ${itemCount} > 0
Value: 

Command: click
Target: css=.item-list li:first-child .delete-button
Value: 

Command: waitForElementNotVisible
Target: css=.loading-spinner
Value: 

Command: storeElementCount
Target: css=.item-list li
Value: itemCount

Command: end
Target: 
Value: 

Este ejemplo elimina elementos de una lista uno por uno hasta que no queden elementos. Es crucial actualizar la variable de control dentro del bucle para evitar bucles infinitos.

Bucle forEach

El comando forEach está diseñado específicamente para procesar colecciones de elementos de la página. Automáticamente itera sobre cada elemento encontrado por un localizador, almacenando cada elemento en una variable que podemos usar dentro del bucle.

Command: forEach
Target: css=.product-card
Value: product

... comandos que usan ${product} ...

Command: end
Target: (vacío)
Value: (vacío)

Un caso práctico sería validar información en cada tarjeta de producto de una página de catálogo:

Command: forEach
Target: css=.product-card
Value: productCard

Command: storeText
Target: ${productCard} .product-name
Value: productName

Command: storeText
Target: ${productCard} .product-price
Value: productPrice

Command: echo
Target: Producto: ${productName}, Precio: ${productPrice}
Value: 

Command: verifyElementPresent
Target: ${productCard} .add-to-cart-button
Value: 

Command: end
Target: 
Value: 

En este ejemplo, forEach recorre cada elemento con clase product-card, almacenando la referencia en la variable productCard. Luego podemos usar ${productCard} como base para localizar elementos específicos dentro de cada tarjeta.

Consideraciones importantes

Al trabajar con bucles en Selenium IDE, debemos tener presentes algunas buenas prácticas:

  • Evitar bucles infinitos: Siempre asegurar que existe una condición de salida clara, especialmente en bucles while
  • Usar esperas apropiadas: Incluir comandos waitFor dentro de los bucles para manejar elementos que aparecen dinámicamente
  • Validar antes de actuar: Verificar que los elementos existen antes de interactuar con ellos, especialmente en bucles forEach
  • Mantener simplicidad: Evitar anidar bucles dentro de otros bucles para mantener la legibilidad y el mantenimiento

Los bucles transforman nuestros tests de secuencias lineales simples a herramientas más inteligentes capaces de adaptarse a contenido dinámico y procesar múltiples elementos de forma eficiente.

Repetición de acciones en tests

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

La repetición de acciones en testing automatizado va más allá de la simple iteración; se trata de crear tests robustos que puedan manejar escenarios complejos del mundo real donde los datos y elementos cambian dinámicamente. Los bucles nos permiten abordar situaciones que serían impracticables con comandos lineales.

Casos comunes de repetición en testing

Validación de listas dinámicas es uno de los escenarios más frecuentes. Imagina una página de resultados de búsqueda donde necesitamos verificar que todos los elementos contienen cierta información:

Command: storeElementCount
Target: css=.search-result
Value: totalResults

Command: times
Target: ${totalResults}
Value: 

Command: storeEval
Target: ${index} || 1
Value: currentIndex

Command: verifyElementPresent
Target: css=.search-result:nth-child(${currentIndex}) .product-image
Value: 

Command: verifyElementPresent
Target: css=.search-result:nth-child(${currentIndex}) .product-title
Value: 

Command: storeEval
Target: ${currentIndex} + 1
Value: index

Command: end
Target: 
Value: 

Procesamiento de formularios múltiples es otro caso típico. En aplicaciones empresariales, frecuentemente encontramos páginas con varios formularios idénticos que requieren validación:

Command: forEach
Target: css=.form-container
Value: formElement

Command: click
Target: ${formElement} input[name="name"]
Value: 

Command: type
Target: ${formElement} input[name="name"]
Value: Usuario Test

Command: click
Target: ${formElement} input[name="email"]
Value: 

Command: type
Target: ${formElement} input[name="email"]
Value: test@empresa.com

Command: click
Target: ${formElement} button[type="submit"]
Value: 

Command: waitForElementVisible
Target: ${formElement} .success-message
Value: 5000

Command: end
Target: 
Value: 

Manejo de paginación automática

La navegación por páginas es un escenario donde los bucles while brillan especialmente. Podemos automatizar la navegación completa por resultados paginados:

Command: store
Target: true
Value: hasNextPage

Command: while
Target: ${hasNextPage} == "true"
Value: 

Command: storeElementCount
Target: css=.result-item
Value: itemsOnPage

Command: echo
Target: Procesando ${itemsOnPage} elementos en esta página
Value: 

Command: forEach
Target: css=.result-item
Value: item

Command: storeText
Target: ${item} .item-title
Value: itemTitle

Command: verifyText
Target: ${item} .item-title
Value: *
Pattern: *

Command: end
Target: 
Value: 

Command: storeElementCount
Target: css=button.next-page:not([disabled])
Value: nextButtonEnabled

Command: if
Target: ${nextButtonEnabled} > 0
Value: 

Command: click
Target: css=button.next-page
Value: 

Command: waitForElementVisible
Target: css=.result-item:first-child
Value: 10000

Command: else
Target: 
Value: 

Command: store
Target: false
Value: hasNextPage

Command: end
Target: 
Value: 

Command: end
Target: 
Value: 

Validación de datos en tablas

Testing de tablas es un área donde la repetición de acciones resulta especialmente valiosa. Podemos validar cada fila de una tabla asegurándonos de que contiene los datos esperados:

Command: storeElementCount
Target: css=table tbody tr
Value: totalRows

Command: store
Target: 1
Value: rowIndex

Command: while
Target: ${rowIndex} <= ${totalRows}
Value: 

Command: storeText
Target: css=table tbody tr:nth-child(${rowIndex}) td:nth-child(1)
Value: columnOne

Command: storeText
Target: css=table tbody tr:nth-child(${rowIndex}) td:nth-child(2)
Value: columnTwo

Command: verifyNotText
Target: css=table tbody tr:nth-child(${rowIndex}) td:nth-child(1)
Value: 

Command: verifyNotText
Target: css=table tbody tr:nth-child(${rowIndex}) td:nth-child(2)
Value: 

Command: storeEval
Target: ${rowIndex} + 1
Value: rowIndex

Command: end
Target: 
Value: 

Estrategias para tests robustos

Combinación de bucles con condicionales crea tests más inteligentes que pueden adaptarse a diferentes estados de la aplicación:

Command: storeElementCount
Target: css=.notification-item
Value: notificationCount

Command: if
Target: ${notificationCount} > 0
Value: 

Command: forEach
Target: css=.notification-item
Value: notification

Command: storeAttribute
Target: ${notification}@class
Value: notificationClass

Command: if
Target: "${notificationClass}".includes("error")
Value: 

Command: click
Target: ${notification} .dismiss-button
Value: 

Command: waitForElementNotVisible
Target: ${notification}
Value: 3000

Command: end
Target: 
Value: 

Command: end
Target: 
Value: 

Command: end
Target: 
Value: 

Manejo de errores durante repeticiones es crucial para mantener la estabilidad de nuestros tests. Podemos usar comandos verify en lugar de assert dentro de bucles para que los errores individuales no detengan todo el proceso:

Command: forEach
Target: css=.data-card
Value: card

Command: verifyElementPresent
Target: ${card} .card-header
Value: 

Command: verifyElementPresent
Target: ${card} .card-content
Value: 

Command: storeElementCount
Target: ${card} .error-indicator
Value: errorCount

Command: if
Target: ${errorCount} > 0
Value: 

Command: echo
Target: ADVERTENCIA: Error encontrado en tarjeta
Value: 

Command: storeText
Target: ${card} .error-message
Value: errorMessage

Command: echo
Target: Error: ${errorMessage}
Value: 

Command: end
Target: 
Value: 

Command: end
Target: 
Value: 

La repetición de acciones convierte nuestros tests en herramientas verdaderamente automatizadas capaces de procesar cantidades variables de datos y adaptarse a diferentes estados de la aplicación, proporcionando una cobertura de testing más completa y realista.

Aprendizajes de esta lección de Selenium

  • Comprender los tipos de bucles disponibles en Selenium IDE: times, while y forEach.
  • Aprender a implementar bucles para repetir acciones un número fijo o basado en condiciones.
  • Saber manejar colecciones de elementos con el bucle forEach para validar o interactuar con cada uno.
  • Identificar buenas prácticas para evitar bucles infinitos y asegurar tests robustos.
  • Aplicar bucles en escenarios comunes como paginación, validación de listas y procesamiento de formularios múltiples.

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