Class: Selenium::WebDriver::Support::Select
Relationships & Source Files | |
Inherits: | Object |
Defined in: | rb/lib/selenium/webdriver/support/select.rb |
Class Method Summary
- .new(element) ⇒ Select constructor
Instance Attribute Summary
-
#multiple? ⇒ Boolean
readonly
Does this select element support selecting multiple options?
Instance Method Summary
-
#deselect_all
Deselect all selected options.
-
#deselect_by(how, what)
Deselect options by visible text, index or value.
-
#first_selected_option ⇒ Element
Get the first selected option in this select element.
-
#options ⇒ Array<Element>
Get all options for this select element.
-
#select_all
Select
all unselected options. -
#select_by(how, what)
Select
options by visible text, index or value. -
#selected_options ⇒ Array<Element>
Get all selected options for this select element.
- #deselect_by_index(index) private
- #deselect_by_text(text) private
- #deselect_by_value(value) private
- #deselect_option(option) private
- #deselect_options(opts) private
- #find_by_index(index) private
- #find_by_text(text) private
- #find_by_value(value) private
- #select_by_index(index) private
- #select_by_text(text) private
- #select_by_value(value) private
- #select_option(option) private
- #select_options(opts) private
Constructor Details
.new(element) ⇒ Select
# 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?
# 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.
# 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? .each { |e| deselect_option e } end
#deselect_by(how, what)
Deselect options by visible text, index or value.
# 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)
# 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)
# 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 (opts) unless opts.empty? raise Error::NoSuchElementError, "cannot locate element with text: #{text.inspect}" end
#deselect_by_value(value) (private)
# 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 (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 (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) .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 = 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 ]#first_selected_option ⇒ Element
Get the first selected option in this select element
# File 'rb/lib/selenium/webdriver/support/select.rb', line 74
def first_selected_option option = .find(&:selected?) return option if option raise Error::NoSuchElementError, 'no options are selected' end
#options ⇒ Array
<Element>
Get all options for this select element
# File 'rb/lib/selenium/webdriver/support/select.rb', line 53
def @element.find_elements tag_name: 'option' end
#select_all
Select
all unselected options. Only valid if the element supports multiple selections.
# 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? .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.
# 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)
# 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)
# File 'rb/lib/selenium/webdriver/support/select.rb', line 163
def select_by_text(text) opts = find_by_text text return (opts) unless opts.empty? raise Error::NoSuchElementError, "cannot locate element with text: #{text.inspect}" end
#select_by_value(value) (private)
# File 'rb/lib/selenium/webdriver/support/select.rb', line 179
def select_by_value(value) opts = find_by_value value return (opts) unless opts.empty? raise Error::NoSuchElementError, "cannot locate option with value: #{value.inspect}" end
#select_option(option) (private)
# 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 (opts) if multiple? opts.each { |o| select_option o } else select_option opts.first end end
#selected_options ⇒ Array
<Element>
Get all selected options for this select element
# File 'rb/lib/selenium/webdriver/support/select.rb', line 63
def .select(&:selected?) end