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



158
159
160
# File 'lib/capybara/selenium/node.rb', line 158

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

#[](name) ⇒ Object



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

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

#all_textObject



8
9
10
11
# 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

#clickObject



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

def click
  native.click
end

#disabled?Boolean



136
137
138
# File 'lib/capybara/selenium/node.rb', line 136

def disabled?
  !native.enabled?
end

#double_clickObject



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

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

#drag_to(element) ⇒ Object



117
118
119
# 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) ⇒ Object



154
155
156
# File 'lib/capybara/selenium/node.rb', line 154

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

#find_xpath(locator) ⇒ Object



150
151
152
# File 'lib/capybara/selenium/node.rb', line 150

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

#hoverObject



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

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

#multiple?Boolean



145
146
147
148
# File 'lib/capybara/selenium/node.rb', line 145

def multiple?
  multiple = self[:multiple]
  multiple and multiple != "false"
end

#pathObject



162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
# File 'lib/capybara/selenium/node.rb', line 162

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

#readonly?Boolean



140
141
142
143
# File 'lib/capybara/selenium/node.rb', line 140

def readonly?
  readonly = self[:readonly]
  readonly and readonly != "false"
end

#right_clickObject



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

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

#select_optionObject



86
87
88
# File 'lib/capybara/selenium/node.rb', line 86

def select_option
  native.click unless selected? || disabled?
end

#selected?Boolean Also known as: checked?



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

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

#send_keys(*args) ⇒ Object



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

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

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

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

Options Hash (options):

  • :clear (Symbol, Array) — default: 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]



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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/capybara/selenium/node.rb', line 38

def set(value, options={})
  tag_name = self.tag_name
  type = self[:type]
  if (Array === value) && !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 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 = "var range = document.createRange();\narguments[0].focus();\nrange.selectNodeContents(arguments[0]);\nwindow.getSelection().addRange(range);\n"
    driver.browser.execute_script script, native
    native.send_keys(value.to_s)
  end
end

#tag_nameObject



121
122
123
# File 'lib/capybara/selenium/node.rb', line 121

def tag_name
  native.tag_name.downcase
end

#unselect_optionObject



90
91
92
93
94
95
# 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

#valueObject



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

def value
  if tag_name == "select" and multiple?
    native.find_elements(:xpath, ".//option").select { |n| n.selected? }.map { |n| n[:value] || n.text }
  else
    native[:value]
  end
end

#visible?Boolean



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

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

#visible_textObject



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

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