Trabajando con elementos select

A la hora de seleccionar elementos puede ser necesario código repetitivo para poder ser automatizado. Para reducir esto y hacer tus test mas limpios, existe un clase Select en los paquetes de soporte de Selenium. Para usarla, necesitarás importarla de la siguiente forma:

import org.openqa.selenium.support.ui.Select;
  
from selenium.webdriver.support.select import Select
  
using OpenQA.Selenium.Support.UI
  
include Selenium::WebDriver::Support
  
// This feature is not implemented - Help us by sending a pr to implement this feature
  
import org.openqa.selenium.support.ui.Select
  

Una vez importado, ya podrás crear un objeto Select usando un WebElement que referencie a un elemento <select>.

WebElement selectElement = driver.findElement(By.id("selectElementID"));
Select selectObject = new Select(selectElement);
  
select_element = driver.find_element(By.ID,'selectElementID')
select_object = Select(select_element)
  
IWebElement selectElement = driver.FindElement(By.Id("selectElementID"));
var selectObject = new SelectElement(selectElement);
  
select_element = driver.find_element(id: 'selectElementID')
select_object = Select(select_element)
  
// This feature is not implemented - Help us by sending a pr to implement this feature
  
val selectElement = driver.findElement(By.id("selectElementID"))
val selectObject = new Select(selectElement)
  

El objeto Select te proporcionará una serie de comandos que te permitirán interactuar con los elementos <select>. Lo primero de todo, existen diferentes formas de seleccionar una opción de un elemento <select>.

<select>
 <option value=value1>Bread</option>
 <option value=value2 selected>Milk</option>
 <option value=value3>Cheese</option>
</select>

Existen tres formas de seleccionar la primera opción del ejemplo que se muestra arriba.

// Selecciona una <option> basándose en el indice interno del elemento <select>
selectObject.selectByIndex(1);

// Selecciona una <option> basándose en su atributo value
selectObject.selectByValue("value1");

// Selecciona una <option> basándose en el texto que muestra
selectObject.selectByVisibleText("Bread");
  
# Selecciona una <option> basándose en el indice interno del elemento <select>
select_object.select_by_index(1)

# Selecciona una <option> basándose en su atributo value
select_object.select_by_value('value1')

# Selecciona una <option> basándose en el texto que muestra
select_object.select_by_visible_text('Bread')
  
// Selecciona una <option> basándose en el indice interno del elemento <select>
selectObject.SelectByIndex(1);

// Selecciona una <option> basándose en su atributo value
selectObject.SelectByValue("value1");

// Selecciona una <option> basándose en el texto que muestra
selectObject.SelectByText("Bread");
  
# Selecciona una <option> basándose en el indice interno del elemento <select>
select_object.select_by(:index, 1)

# Selecciona una <option> basándose en su atributo value
select_object.select_by(:value, 'value1')

# Selecciona una <option> basándose en el texto que muestra
select_object.select_by(:text, 'Bread')
  
// This feature is not implemented - Help us by sending a pr to implement this feature
  
// Selecciona una <option> basándose en el indice interno del elemento <select>
selectObject.selectByIndex(1)

// Selecciona una <option> basándose en su atributo value
selectObject.selectByValue("value1")

// Selecciona una <option> basándose en el texto que muestra
selectObject.selectByVisibleText("Bread")
  

Puedes revisar que opciones están seleccionadas usando:

// Devuelve una Lista de <WebElements> con las opciones que han sido seleccionadas
List<WebElement> allSelectedOptions = selectObject.getAllSelectedOptions();

// Devuelve un WebElement que referencia a la primera opción seleccionada que se encontró en el DOM
WebElement firstSelectedOption = selectObject.getFirstSelectedOption();
  
# Devuelve una Lista de [WebElements] con las opciones que han sido seleccionadas
all_selected_options = select_object.all_selected_options

# Devuelve un WebElement que referencia a la primera opción seleccionada que se encontró en el DOM
first_selected_option = select_object.first_selected_option
  
// Return a List<WebElement> of options that have been selected
var allSelectedOptions = selectObject.AllSelectedOptions;

// Return a WebElement referencing the first selection option found by walking down the DOM
var firstSelectedOption = selectObject.AllSelectedOptions.FirstOrDefault();
  
# Devuelve un Array de <WebElements> con las opciones que han sido seleccionadas
all_selected_options = select_object.selected_options

# Devuelve un WebElement que referencia a la primera opción seleccionada que se encontró en el DOM
first_selected_option = select_object.first_selected_option
  
// This feature is not implemented - Help us by sending a pr to implement this feature
  
// Devuelve una Lista de <WebElements> con las opciones que han sido seleccionadas
val allSelectedOptions = selectObject.allSelectedOptions

// Devuelve un WebElement que referencia a la primera opción seleccionada que se encontró en el DOM
val firstSelectedOption = selectObject.firstSelectedOption
  

Tambien existe una forma de obtener que elementos <option> contiene un <select>:

// Devuelve una lista de <WebElements> que contiene las opciones de un elemento <select>
List<WebElement> allAvailableOptions = selectObject.getOptions();
  
# Devuelve una lista de [WebElements] que contiene las opciones de un elemento &lt;select&gt;
all_available_options = select_object.options
  
// Devuelve una IList de <IWebElements> que contiene las opciones de un elemento <select>
IList<IWebElement> allAvailableOptions = selectObject.Options;
  
# Devuelve un array de [WebElements] que contiene las opciones de un elemento &lt;select&gt;
all_available_options = select_object.options
  
// This feature is not implemented - Help us by sending a pr to implement this feature
  
// Devuelve una lista de <WebElements> que contiene las opciones de un elemento <select>
val allAvailableOptions = selectObject.options
  

A la hora de deseleccionar elementos dispones de cuatro opciones:

// Deseleccionar una <option> basándose en el indice interno de un elemento <select>
selectObject.deselectByIndex(1);

// Deseleccionar una <option> basándose en su atributo `value`
selectObject.deselectByValue("value1");

// Deseleccionar una <option> basándose en el texto que muestra
selectObject.deselectByVisibleText("Bread");

// Deseleccionar todos los elementos <option> que estan seleccionados
selectObject.deselectAll();
  
# Deseleccionar una <option> basándose en el indice interno de un elemento <select>
select_object.deselect_by_index(1)

# Deseleccionar una <option> basándose en su atributo `value`
select_object.deselect_by_value('value1')

# Deseleccionar una <option> basándose en el texto que muestra
select_object.deselect_by_visible_text('Bread')

# Deseleccionar todos los elementos <option> que estan seleccionados
select_object.deselect_all()
  
// Deseleccionar una <option> basándose en el indice interno de un elemento <select>
selectObject.DeselectByIndex(1);

// Deseleccionar una <option> basándose en su atributo `value`
selectObject.DeselectByValue("value1");

// Deseleccionar una <option> basándose en el texto que muestra
selectObject.DeselectByText("Bread");

// Deseleccionar todos los elementos <option> que estan seleccionados
selectObject.DeselectAll();
  
# Deseleccionar una <option> basándose en el indice interno de un elemento <select>
select_object.deselect_by(:index, 1)

# Deseleccionar una <option> basándose en su atributo `value`
select_object.deselect_by(:value, 'value1')

# Deseleccionar una <option> basándose en el texto que muestra
select_object.deselect_by(:text, 'Bread')

# Deseleccionar todos los elementos <option> que estan seleccionados
select_object.deselect_all
  
// This feature is not implemented - Help us by sending a pr to implement this feature
  
// Deseleccionar una <option> basándose en el indice interno de un elemento <select>
selectObject.deselectByIndex(1)

// Deseleccionar una <option> basándose en su atributo `value`
selectObject.deselectByValue("value1")

// Deseleccionar una <option> basándose en el texto que muestra
selectObject.deselectByVisibleText("Bread")

// Deseleccionar todos los elementos <option> que estan seleccionados
selectObject.deselectAll()
  

Finalmente, existen algunos elementos <select> que te permiten seleccionar mas de una opción. Puedes comprobar si tu elemento <select> es uno de estos usando:

Boolean doesThisAllowMultipleSelections = selectObject.isMultiple();
  
does_this_allow_multiple_selections = select_object.is_multiple
  
bool doesThisAllowMultipleSelections = selectObject.IsMultiple;
  
does_this_allow_multiple_selections = select_object.multiple?
  
// This feature is not implemented - Help us by sending a pr to implement this feature
  
val doesThisAllowMultipleSelections = selectObject.isMultiple