class Capybara::Selenium::Node

frozen_string_literal: true

Public Instance Methods

==(other) click to toggle source
# File lib/capybara/selenium/node.rb, line 149
def ==(other)
  native == other.native
end
[](name) click to toggle source
# File lib/capybara/selenium/node.rb, line 13
def [](name)
  native.attribute(name.to_s)
rescue Selenium::WebDriver::Error::WebDriverError
  nil
end
all_text() click to toggle source
# File lib/capybara/selenium/node.rb, line 8
def all_text
  text = driver.browser.execute_script("return arguments[0].textContent", native)
  Capybara::Helpers.normalize_whitespace(text)
end
checked?()
Alias for: selected?
click() click to toggle source
# File lib/capybara/selenium/node.rb, line 97
def click
  native.click
end
disabled?() click to toggle source
# File lib/capybara/selenium/node.rb, line 135
def disabled?
  !native.enabled?
end
double_click() click to toggle source
# File lib/capybara/selenium/node.rb, line 105
def double_click
  driver.browser.action.double_click(native).perform
end
drag_to(element) click to toggle source
# File lib/capybara/selenium/node.rb, line 117
def drag_to(element)
  driver.browser.action.drag_and_drop(native, element.native).perform
end
find_css(locator) click to toggle source
# File lib/capybara/selenium/node.rb, line 145
def find_css(locator)
  native.find_elements(:css, locator).map { |n| self.class.new(driver, n) }
end
find_xpath(locator) click to toggle source
# File lib/capybara/selenium/node.rb, line 141
def find_xpath(locator)
  native.find_elements(:xpath, locator).map { |n| self.class.new(driver, n) }
end
hover() click to toggle source
# File lib/capybara/selenium/node.rb, line 113
def hover
  driver.browser.action.move_to(native).perform
end
path() click to toggle source
# File lib/capybara/selenium/node.rb, line 153
def path
  path = find_xpath('ancestor::*').reverse
  path.unshift self

  result = []
  while node = path.shift
    parent = path.first

    if parent
      siblings = parent.find_xpath(node.tag_name)
      if siblings.size == 1
        result.unshift node.tag_name
      else
        index = siblings.index(node)
        result.unshift "#{node.tag_name}[#{index+1}]"
      end
    else
      result.unshift node.tag_name
    end
  end

  '/' + result.join('/')
end
right_click() click to toggle source
# File lib/capybara/selenium/node.rb, line 101
def right_click
  driver.browser.action.context_click(native).perform
end
select_option() click to toggle source
# File lib/capybara/selenium/node.rb, line 86
def select_option
  native.click unless selected?
end
selected?() click to toggle source
# File lib/capybara/selenium/node.rb, line 130
def selected?
  selected = native.selected?
  selected and selected != "false"
end
Also aliased as: checked?
send_keys(*args) click to toggle source
# File lib/capybara/selenium/node.rb, line 109
def send_keys(*args)
  native.send_keys(*args)
end
set(value, options={}) click to toggle source

Set the value of the form element to the given value.

@param [String] value The new value @param [Hash{}] options Driver specific options for how to set the value @option options [Symbol,Array] :clear (nil) The method used to clear the previous value <br/>

nil => clear via javascript <br/>
:none =>  append the new value to the existing value <br/>
:backspace => send backspace keystrokes to clear the field <br/>
Array => an array of keys to send before the value being set, e.g. [[:command, 'a'], :backspace]
# File lib/capybara/selenium/node.rb, line 38
def set(value, options={})
  tag_name = self.tag_name
  type = self[:type]
  if (Array === value) && !self[:multiple]
    raise ArgumentError.new "Value cannot be an Array when 'multiple' attribute is not present. Not a #{value.class}"
  end
  if tag_name == 'input' and type == 'radio'
    click
  elsif tag_name == 'input' and type == 'checkbox'
    click if value ^ native.attribute('checked').to_s.eql?("true")
  elsif tag_name == 'input' and type == 'file'
    path_names = value.to_s.empty? ? [] : value
    native.send_keys(*path_names)
  elsif tag_name == 'textarea' or tag_name == 'input'
    if self[:readonly]
      warn "Attempt to set readonly element with value: #{value} \n *This will raise an exception in a future version of Capybara"
    elsif value.to_s.empty?
      native.clear
    else
      if options[:clear] == :backspace
        # Clear field by sending the correct number of backspace keys.
        backspaces = [:backspace] * self.value.to_s.length
        native.send_keys(*(backspaces + [value.to_s]))
      elsif options[:clear] == :none
        native.send_keys(value.to_s)
      elsif options[:clear].is_a? Array
        native.send_keys(*options[:clear], value.to_s)
      else
        # Clear field by JavaScript assignment of the value property.
        # Script can change a readonly element which user input cannot, so
        # don't execute if readonly.
        driver.browser.execute_script "arguments[0].value = ''", native
        native.send_keys(value.to_s)
      end
    end
  elsif native.attribute('isContentEditable')
    #ensure we are focused on the element
    script = <<-JS
      var range = document.createRange();
      arguments[0].focus();
      range.selectNodeContents(arguments[0]);
      window.getSelection().addRange(range);
    JS
    driver.browser.execute_script script, native
    native.send_keys(value.to_s)
  end
end
tag_name() click to toggle source
# File lib/capybara/selenium/node.rb, line 121
def tag_name
  native.tag_name.downcase
end
unselect_option() click to toggle source
# File lib/capybara/selenium/node.rb, line 90
def unselect_option
  if select_node['multiple'] != 'multiple' and select_node['multiple'] != 'true'
    raise Capybara::UnselectNotAllowed, "Cannot unselect option from single select box."
  end
  native.click if selected?
end
value() click to toggle source
# File lib/capybara/selenium/node.rb, line 19
def value
  if tag_name == "select" and self[:multiple] and not self[:multiple] == "false"
    native.find_elements(:xpath, ".//option").select { |n| n.selected? }.map { |n| n[:value] || n.text }
  else
    native[:value]
  end
end
visible?() click to toggle source
# File lib/capybara/selenium/node.rb, line 125
def visible?
  displayed = native.displayed?
  displayed and displayed != "false"
end
visible_text() click to toggle source
# File lib/capybara/selenium/node.rb, line 3
def visible_text
  # Selenium doesn't normalize Unicode whitespace.
  Capybara::Helpers.normalize_whitespace(native.text)
end

Private Instance Methods

select_node() click to toggle source

a reference to the select node if this is an option node

# File lib/capybara/selenium/node.rb, line 180
def select_node
  find_xpath('./ancestor::select').first
end