class Selenium::WebDriver::Support::Select

Public Class Methods

new(element) click to toggle source

@param [Element] element The select element to use

# File lib/selenium/webdriver/support/select.rb, line 10
def initialize(element)
  tag_name = element.tag_name

  unless tag_name.downcase == "select"
    raise ArgumentError, "unexpected tag name #{tag_name.inspect}"
  end

  @element = element
  @multi   = ![nil, "false"].include?(element.attribute(:multiple))
end

Public Instance Methods

deselect_all() click to toggle source

Deselect all selected options. Only valid if the element supports multiple selections.

@raise [Error::UnsupportedOperationError] if the element does not support multiple selections.

# File lib/selenium/webdriver/support/select.rb, line 138
def deselect_all
  unless multiple?
    raise Error::UnsupportedOperationError, 'you may only deselect all options of a multi-select'
  end

  options.each { |e| deselect_option e }
end
deselect_by(how, what) click to toggle source

Deselect options by visible text, index or value.

@param [:text, :index, :value] how How to find the option @param [String] what What value to find the option by.

@see #select_by

# File lib/selenium/webdriver/support/select.rb, line 105
def deselect_by(how, what)
  case how
  when :text
    deselect_by_text what
  when :value
    deselect_by_value what
  when :index
    deselect_by_index what
  else
    raise ArgumentError, "can't deselect options by #{how.inspect}"
  end
end
first_selected_option() click to toggle source

Get the first selected option in this select element

@raise [Error::NoSuchElementError] if no options are selected @return [Element]

# File lib/selenium/webdriver/support/select.rb, line 58
def first_selected_option
  option = options.find { |e| e.selected? }
  option or raise Error::NoSuchElementError, 'no options are selected'
end
multiple?() click to toggle source

Does this select element support selecting multiple options?

@return [Boolean]

# File lib/selenium/webdriver/support/select.rb, line 27
def multiple?
  @multi
end
options() click to toggle source

Get all options for this select element

@return [Array<Element>]

# File lib/selenium/webdriver/support/select.rb, line 37
def options
  @element.find_elements :tag_name, 'option'
end
select_all() click to toggle source

Select all unselected options. Only valid if the element supports multiple selections.

@raise [Error::UnsupportedOperationError] if the element does not support multiple selections.

# File lib/selenium/webdriver/support/select.rb, line 124
def select_all
  unless multiple?
    raise Error::UnsupportedOperationError, 'you may only select all options of a multi-select'
  end

  options.each { |e| select_option e }
end
select_by(how, what) click to toggle source

Select options by visible text, index or value.

When selecting by :text, selects options that display text matching the argument. That is, when given “Bar” this would select an option like:

<option value="foo">Bar</option>

When slecting by :value, selects all options that have a value matching the argument. That is, when given “foo” this would select an option like:

<option value="foo">Bar</option>

When selecting by :index, selects the option at the given index. This is done by examining the “index” attribute of an element, and not merely by counting.

@param [:text, :index, :value] how How to find the option @param [String] what What value to find the option by.

# File lib/selenium/webdriver/support/select.rb, line 83
def select_by(how, what)
  case how
  when :text
    select_by_text what
  when :index
    select_by_index what
  when :value
    select_by_value what
  else
    raise ArgumentError, "can't select options by #{how.inspect}"
  end
end
selected_options() click to toggle source

Get all selected options for this select element

@return [Array<Element>]

# File lib/selenium/webdriver/support/select.rb, line 47
def selected_options
  options.select { |e| e.selected? }
end

Private Instance Methods

deselect_by_index(index) click to toggle source
# File lib/selenium/webdriver/support/select.rb, line 198
def deselect_by_index(index)
  opts = find_by_index index

  if opts.empty?
    raise Error::NoSuchElementError, "cannot locate option with index: #{index}"
  end

  deselect_options opts
end
deselect_by_text(text) click to toggle source
# File lib/selenium/webdriver/support/select.rb, line 178
def deselect_by_text(text)
  opts = find_by_text text

  if opts.empty?
    raise Error::NoSuchElementError, "cannot locate element with text: #{text.inspect}"
  end

  deselect_options opts
end
deselect_by_value(value) click to toggle source
# File lib/selenium/webdriver/support/select.rb, line 188
def deselect_by_value(value)
  opts = find_by_value value

  if opts.empty?
    raise Error::NoSuchElementError, "cannot locate option with value: #{value.inspect}"
  end

  deselect_options opts
end
deselect_option(option) click to toggle source
# File lib/selenium/webdriver/support/select.rb, line 214
def deselect_option(option)
  option.click if option.selected?
end
deselect_options(opts) click to toggle source
# File lib/selenium/webdriver/support/select.rb, line 226
def deselect_options(opts)
  if multiple?
    opts.each { |o| deselect_option o }
  else
    deselect_option opts.first
  end
end
find_by_index(index) click to toggle source
# File lib/selenium/webdriver/support/select.rb, line 258
def find_by_index(index)
  index = index.to_s
  options.select { |option| option.attribute(:index) == index }
end
find_by_text(text) click to toggle source
# File lib/selenium/webdriver/support/select.rb, line 234
def find_by_text(text)
  xpath = ".//option[normalize-space(.) = #{Escaper.escape text}]"
  opts = @element.find_elements(:xpath, xpath)

  if opts.empty? && text =~ /\s+/
    longest_word = text.split(/\s+/).max_by { |item| item.length }

    if longest_word.empty?
      candidates = options
    else
      xpath = ".//option[contains(., #{Escaper.escape longest_word})]"
      candidates = @element.find_elements(:xpath, xpath)
    end

    if multiple?
      candidates.select { |option| text == option.text }
    else
      Array(candidates.find { |option| text == option.text })
    end
  else
    opts
  end
end
find_by_value(value) click to toggle source
# File lib/selenium/webdriver/support/select.rb, line 263
def find_by_value(value)
  @element.find_elements(:xpath, ".//option[@value = #{Escaper.escape value}]")
end
select_by_index(index) click to toggle source
# File lib/selenium/webdriver/support/select.rb, line 158
def select_by_index(index)
  opts = find_by_index index

  if opts.empty?
    raise Error::NoSuchElementError, "cannot locate element with index: #{index.inspect}"
  end

  select_options opts
end
select_by_text(text) click to toggle source
# File lib/selenium/webdriver/support/select.rb, line 148
def select_by_text(text)
  opts = find_by_text text

  if opts.empty?
    raise Error::NoSuchElementError, "cannot locate element with text: #{text.inspect}"
  end

  select_options opts
end
select_by_value(value) click to toggle source
# File lib/selenium/webdriver/support/select.rb, line 168
def select_by_value(value)
  opts = find_by_value value

  if opts.empty?
    raise Error::NoSuchElementError, "cannot locate option with value: #{value.inspect}"
  end

  select_options opts
end
select_option(option) click to toggle source
# File lib/selenium/webdriver/support/select.rb, line 210
def select_option(option)
  option.click unless option.selected?
end
select_options(opts) click to toggle source
# File lib/selenium/webdriver/support/select.rb, line 218
def select_options(opts)
  if multiple?
    opts.each { |o| select_option o }
  else
    select_option opts.first
  end
end