El trabajar con menús desplegables es una de las tareas más habituales en la automatización de pruebas web con Selenium WebDriver.
Los formularios de registro, filtros de productos o selectores de país suelen utilizar elementos <select>, por lo que dominar la clase Select es clave para construir pruebas robustas y fáciles de mantener. En esta guía verás, paso a paso, cómo seleccionar valores de un dropdown en Selenium, qué métodos tienes disponibles y cómo trabajar con listas de selección múltiple.
¿Qué es la clase Select en Selenium?
La clase Select es una utilidad de Selenium WebDriver que facilita el manejo de elementos HTML <select> y sus opciones <option>. En lugar de implementar clics y XPaths manuales, Select ofrece métodos específicos para:
- Seleccionar opciones por texto visible, valor o índice.
- Consultar si un desplegable permite selección múltiple.
- Desmarcar opciones previamente seleccionadas.
- Administrar listas de selección simple y múltiple con un código mucho más legible.
Al tratarse de una clase normal de Java, se instancia con la palabra clave new y recibe como parámetro el WebElement correspondiente al <select> que quieres controlar.
Requisitos previos: importar Select e instanciar el dropdown
Antes de interactuar con cualquier dropdown, hay dos pasos imprescindibles:
- Importar el paquete de la clase
Select. - Localizar el elemento
<select>y crear una instancia deSelecta partir de él.
Un ejemplo clásico es el desplegable de país (“Country”) en la página de registro de Mercury Tours:
- URL de ejemplo:
https://cibered.com/test/newtours/register.php. - El elemento
<select>de país se localiza, por ejemplo, por el atributoname="country".
Paso 1: importar la clase Select
import org.openqa.selenium.support.ui.Select;
Paso 2: crear la instancia del dropdown
Select drpCountry = new Select(driver.findElement(By.name("country")));
A partir de este momento puedes llamar a los distintos métodos de Select para elegir la opción que necesites.
Métodos principales para seleccionar valores en un dropdown
La clase Select proporciona varios métodos para seleccionar y deseleccionar opciones. Los más importantes son selectByVisibleText, selectByValue y selectByIndex, además de utilidades como isMultiple o deselectAll.
1. selectByVisibleText() / deselectByVisibleText()
Este método selecciona o deselecciona la opción cuyo texto visible coincide exactamente con el que indiques. Es el más legible y el preferido cuando el texto del desplegable es estable.
- Uso típico: cuando conoces la etiqueta que ve el usuario en el desplegable.
- Parámetro: la cadena de texto tal y como aparece en la opción.
Ejemplo:
drpCountry.selectByVisibleText("ANTARCTICA");
Este código selecciona la opción “ANTARCTICA” en la lista de países.
2. selectByValue() / deselectByValue()
Selecciona o deselecciona la opción cuyo atributo value coincide con el valor que pasas como parámetro. Es útil cuando el texto visible puede variar, pero el valor interno se mantiene estable.
- Uso típico: cuando trabajas con valores normalizados (códigos numéricos o abreviaturas).
- Parámetro: el contenido del atributo
valuedel<option>que quieres seleccionar.
Ejemplo:
drpCountry.selectByValue("234");
En muchos formularios, el país “ANTARCTICA” podría tener internamente un código numérico como 234. Aunque el usuario vea un texto, Selenium se guía por el valor definido en el HTML.
3. selectByIndex() / deselectByIndex()
Selecciona o deselecciona la opción según la posición que ocupe dentro del desplegable, empezando a contar desde 0.
- Uso típico: cuando el orden es fijo y no tienes un texto o valor estable.
- Parámetro: entero que indica el índice de la opción.
Ejemplo:
drpCountry.selectByIndex(0);
Este código selecciona la primera opción del desplegable. Hay que tener cuidado con este método, porque cualquier cambio en el orden de las opciones puede romper las pruebas.
4. isMultiple()
Indica si el desplegable permite seleccionar varias opciones al mismo tiempo (es decir, si se trata de un <select multiple>).
- Devuelve
truecuando el<select>permite selección múltiple. - Devuelve
falsecuando solo se permite una opción.
Ejemplo:
if (drpCountry.isMultiple()) {
// lógica específica para selects de selección múltiple
}
Este chequeo es fundamental antes de intentar seleccionar varias opciones o utilizar métodos de deselección masiva.
5. deselectAll()
Desmarca todas las opciones seleccionadas en un <select> que admita selección múltiple. Solo es válido cuando isMultiple() devuelve true.
Ejemplo:
drpCountry.deselectAll();
Este método resulta muy útil para “resetear” el estado de un desplegable multi-select antes de aplicar un conjunto de selecciones nuevo.
Código completo de ejemplo: manejar dropdowns con Selenium
El siguiente ejemplo en Java muestra un flujo completo:
- Abrir la página de registro de Mercury Tours.
- Seleccionar un país mediante
selectByVisibleText. - Abrir una página con un desplegable de selección múltiple.
- Seleccionar varias opciones utilizando distintos métodos.
package newpackage;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.support.ui.Select;
import org.openqa.selenium.By;
public class accessDropDown {
public static void main(String[] args) {
System.setProperty("webdriver.gecko.driver","C:\\geckodriver.exe");
String baseURL = "https://cibered.com/test/newtours/register.php";
WebDriver driver = new FirefoxDriver();
// 1. Navegar a la página de registro
driver.get(baseURL);
// 2. Trabajar con el dropdown de país
Select drpCountry = new Select(driver.findElement(By.name("country")));
drpCountry.selectByVisibleText("ANTARCTICA");
// 3. Seleccionar elementos en un SELECT múltiple
driver.get("http://jsbin.com/osebed/2");
Select fruits = new Select(driver.findElement(By.id("fruits")));
// Seleccionar por texto visible
fruits.selectByVisibleText("Banana");
// Seleccionar por índice
fruits.selectByIndex(1);
// Cerrar navegador al finalizar
// driver.quit();
}
}
En este ejemplo se ve claramente cómo la misma clase Select se utiliza tanto para desplegables de selección simple como para listas de selección múltiple.
Seleccionar múltiples opciones en un SELECT de selección múltiple
Algunos desplegables permiten elegir varias opciones a la vez (por ejemplo, listas de intereses o categorías). En HTML esto se declara con el atributo multiple en la etiqueta <select>. Desde Selenium, puedes tratar estos elementos casi igual que los desplegables normales, pero invocando los métodos de selección varias veces.
Ejemplo típico con un <select> múltiple:
Select fruits = new Select(driver.findElement(By.id("fruits")));
if (fruits.isMultiple()) {
fruits.selectByVisibleText("Banana");
fruits.selectByVisibleText("Apple");
fruits.selectByIndex(3);
}
Aquí se seleccionan varias frutas con una combinación de métodos: por texto visible y por índice. Si en algún momento quieres desmarcar todas, bastaría con:
fruits.deselectAll();
Buenas prácticas para manejar dropdowns con Selenium
Para que tus tests sean más estables, legibles y fáciles de mantener, conviene seguir algunas recomendaciones:
- Preferir
selectByVisibleText()cuando el texto del desplegable es fijo y claro, ya que hace el código más autoexplicativo. - Usar
selectByValue()cuando el atributovaluesea la clave lógica (por ejemplo, IDs de base de datos, códigos internos o abreviaturas). - Reservar
selectByIndex()para escenarios controlados, ya que cualquier cambio en el orden puede romper tu prueba. - Comprobar siempre si el desplegable es múltiple con
isMultiple()antes de intentar seleccionar o deseleccionar varias opciones. - Encapsular la lógica de manejo de dropdowns en métodos reutilizables (por ejemplo, helpers que reciban el
WebElementy el tipo de selección), especialmente en proyectos grandes. - Añadir aserciones después de seleccionar opciones, verificando que los valores elegidos son los esperados antes de continuar el flujo de prueba.
Resumen de comandos clave para dropdowns en Selenium
A modo de referencia rápida, estos son los métodos más importantes de la clase Select y su finalidad:
selectByVisibleText(String text): selecciona una opción por el texto que ve el usuario.deselectByVisibleText(String text): desmarca una opción por su texto visible.selectByValue(String value): selecciona una opción por el valor de su atributovalue.deselectByValue(String value): desmarca una opción por su atributovalue.selectByIndex(int index): selecciona la opción situada en la posición indicada (empezando en 0).deselectByIndex(int index): desmarca la opción de la posición indicada.isMultiple(): indica si el desplegable permite seleccionar varias opciones a la vez.deselectAll(): desmarca todas las opciones seleccionadas en un dropdown múltiple.
Dominar estos métodos te permitirá automatizar de forma profesional cualquier tipo de formulario con menús desplegables, mejorar la calidad de tus pruebas y reducir el mantenimiento a largo plazo.
