Class: Capybara::Selenium::Node

Inherits:
Driver::Node show all
Defined in:
lib/capybara/selenium/node.rb

Instance Attribute Summary

Attributes inherited from Driver::Node

#driver, #native

Instance Method Summary collapse

Methods inherited from Driver::Node

#initialize, #inspect, #trigger

Constructor Details

This class inherits a constructor from Capybara::Driver::Node

Instance Method Details

#==(other) ⇒ Object



132
133
134
# File 'lib/capybara/selenium/node.rb', line 132

def ==(other)
  native == other.native
end

#[](name) ⇒ Object



12
13
14
15
16
# File 'lib/capybara/selenium/node.rb', line 12

def [](name)
  native.attribute(name.to_s)
rescue Selenium::WebDriver::Error::WebDriverError
  nil
end

#all_textObject



7
8
9
10
# File 'lib/capybara/selenium/node.rb', line 7

def all_text
  text = driver.browser.execute_script("return arguments[0].textContent", native)
  Capybara::Helpers.normalize_whitespace(text)
end

#clickObject



80
81
82
# File 'lib/capybara/selenium/node.rb', line 80

def click
  native.click
end

#disabled?Boolean

Returns:

  • (Boolean)


118
119
120
# File 'lib/capybara/selenium/node.rb', line 118

def disabled?
  !native.enabled?
end

#double_clickObject



88
89
90
# File 'lib/capybara/selenium/node.rb', line 88

def double_click
  driver.browser.action.double_click(native).perform
end

#drag_to(element) ⇒ Object



100
101
102
# File 'lib/capybara/selenium/node.rb', line 100

def drag_to(element)
  driver.browser.action.drag_and_drop(native, element.native).perform
end

#find_css(locator) ⇒ Object



128
129
130
# File 'lib/capybara/selenium/node.rb', line 128

def find_css(locator)
  native.find_elements(:css, locator).map { |n| self.class.new(driver, n) }
end

#find_xpath(locator) ⇒ Object



124
125
126
# File 'lib/capybara/selenium/node.rb', line 124

def find_xpath(locator)
  native.find_elements(:xpath, locator).map { |n| self.class.new(driver, n) }
end

#hoverObject



96
97
98
# File 'lib/capybara/selenium/node.rb', line 96

def hover
  driver.browser.action.move_to(native).perform
end

#pathObject



136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
# File 'lib/capybara/selenium/node.rb', line 136

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_clickObject



84
85
86
# File 'lib/capybara/selenium/node.rb', line 84

def right_click
  driver.browser.action.context_click(native).perform
end

#select_optionObject



69
70
71
# File 'lib/capybara/selenium/node.rb', line 69

def select_option
  native.click unless selected?
end

#selected?Boolean Also known as: checked?

Returns:

  • (Boolean)


113
114
115
116
# File 'lib/capybara/selenium/node.rb', line 113

def selected?
  selected = native.selected?
  selected and selected != "false"
end

#send_keys(*args) ⇒ Object



92
93
94
# File 'lib/capybara/selenium/node.rb', line 92

def send_keys(*args)
  native.send_keys(*args)
end

#set(value, fill_options = {}) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/capybara/selenium/node.rb', line 26

def set(value, fill_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 fill_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]))
      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();
      range.selectNodeContents(arguments[0]);
      window.getSelection().addRange(range);
    JS
    driver.browser.execute_script script, native
    native.send_keys(value.to_s)
  end
end

#tag_nameObject



104
105
106
# File 'lib/capybara/selenium/node.rb', line 104

def tag_name
  native.tag_name.downcase
end

#unselect_optionObject



73
74
75
76
77
78
# File 'lib/capybara/selenium/node.rb', line 73

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

#valueObject



18
19
20
21
22
23
24
# File 'lib/capybara/selenium/node.rb', line 18

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?Boolean

Returns:

  • (Boolean)


108
109
110
111
# File 'lib/capybara/selenium/node.rb', line 108

def visible?
  displayed = native.displayed?
  displayed and displayed != "false"
end

#visible_textObject



2
3
4
5
# File 'lib/capybara/selenium/node.rb', line 2

def visible_text
  # Selenium doesn't normalize Unicode whitespace.
  Capybara::Helpers.normalize_whitespace(native.text)
end