123456789_123456789_123456789_123456789_123456789_

Class: Selenium::WebDriver::Support::Select

Relationships & Source Files
Inherits: Object
Defined in: rb/lib/selenium/webdriver/support/select.rb

Class Method Summary

Instance Attribute Summary

Instance Method Summary

Constructor Details

.new(element) ⇒ Select

Parameters:

  • element (Element)

    The select element to use

Raises:

  • (ArgumentError)
[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 28

def initialize(element)
  tag_name = element.tag_name

  raise ArgumentError, "unexpected tag name #{tag_name.inspect}" unless tag_name.casecmp('select').zero?

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

Instance Attribute Details

#multiple?Boolean (readonly)

Does this select element support selecting multiple options?

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 43

def multiple?
  @multi
end

Instance Method Details

#deselect_all

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

Raises:

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 155

def deselect_all
  raise Error::UnsupportedOperationError, 'you may only deselect all options of a multi-select' unless multiple?

  options.each { |e| deselect_option e }
end

#deselect_by(how, what)

Deselect options by visible text, index or value.

Parameters:

  • how (:text, :index, :value)

    How to find the option

  • what (String)

    What value to find the option by.

Raises:

See Also:

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 124

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

#deselect_by_index(index) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 207

def deselect_by_index(index)
  raise Error::UnsupportedOperationError, 'you may only deselect option of a multi-select' unless multiple?

  opts = find_by_index index

  return deselect_option(opts.first) unless opts.empty?

  raise Error::NoSuchElementError, "cannot locate option with index: #{index}"
end

#deselect_by_text(text) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 187

def deselect_by_text(text)
  raise Error::UnsupportedOperationError, 'you may only deselect option of a multi-select' unless multiple?

  opts = find_by_text text

  return deselect_options(opts) unless opts.empty?

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

#deselect_by_value(value) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 197

def deselect_by_value(value)
  raise Error::UnsupportedOperationError, 'you may only deselect option of a multi-select' unless multiple?

  opts = find_by_value value

  return deselect_options(opts) unless opts.empty?

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

#deselect_option(option) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 223

def deselect_option(option)
  option.click if option.selected?
end

#deselect_options(opts) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 235

def deselect_options(opts)
  if multiple?
    opts.each { |o| deselect_option o }
  else
    deselect_option opts.first
  end
end

#find_by_index(index) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 262

def find_by_index(index)
  options.select { |option| option.property(:index) == index }
end

#find_by_text(text) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 243

def find_by_text(text)
  xpath = ".//option[normalize-space(.) = #{Escaper.escape text}]"
  opts = @element.find_elements(xpath: xpath)

  return opts unless opts.empty? && /\s+/.match?(text)

  longest_word = text.split(/\s+/).max_by(&:length)
  if longest_word.empty?
    candidates = options
  else
    xpath = ".//option[contains(., #{Escaper.escape longest_word})]"
    candidates = @element.find_elements(xpath: xpath)
  end

  return Array(candidates.find { |option| text == option.text }) unless multiple?

  candidates.select { |option| text == option.text }
end

#find_by_value(value) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 266

def find_by_value(value)
  @element.find_elements(xpath: ".//option[@value = #{Escaper.escape value}]")
end

#first_selected_optionElement

Get the first selected option in this select element

Raises:

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 74

def first_selected_option
  option = options.find(&:selected?)
  return option if option

  raise Error::NoSuchElementError, 'no options are selected'
end

#optionsArray<Element>

Get all options for this select element

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 53

def options
  @element.find_elements tag_name: 'option'
end

#select_all

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

Raises:

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 143

def select_all
  raise Error::UnsupportedOperationError, 'you may only select all options of a multi-select' unless multiple?

  options.each { |e| select_option e }
end

#select_by(how, what)

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 selecting 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.

Parameters:

  • how (:text, :index, :value)

    How to find the option

  • what (String)

    What value to find the option by.

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 101

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

#select_by_index(index) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 171

def select_by_index(index)
  opts = find_by_index index

  return select_option(opts.first) unless opts.empty?

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

#select_by_text(text) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 163

def select_by_text(text)
  opts = find_by_text text

  return select_options(opts) unless opts.empty?

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

#select_by_value(value) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 179

def select_by_value(value)
  opts = find_by_value value

  return select_options(opts) unless opts.empty?

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

#select_option(option) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 217

def select_option(option)
  raise Error::UnsupportedOperationError, 'You may not select a disabled option' unless option.enabled?

  option.click unless option.selected?
end

#select_options(opts) (private)

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 227

def select_options(opts)
  if multiple?
    opts.each { |o| select_option o }
  else
    select_option opts.first
  end
end

#selected_optionsArray<Element>

Get all selected options for this select element

[ GitHub ]

  
# File 'rb/lib/selenium/webdriver/support/select.rb', line 63

def selected_options
  options.select(&:selected?)
end