Class: Ferrum::Node

Inherits:
Object
  • Object
show all
Defined in:
lib/ferrum/node.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(page, target_id, node_id, description) ⇒ Node

Returns a new instance of Node.



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

def initialize(page, target_id, node_id, description)
  @page, @target_id, @node_id, @description =
    page, target_id, node_id, description
end

Instance Attribute Details

#descriptionObject (readonly)

Returns the value of attribute description.



5
6
7
# File 'lib/ferrum/node.rb', line 5

def description
  @description
end

#node_idObject (readonly)

Returns the value of attribute node_id.



5
6
7
# File 'lib/ferrum/node.rb', line 5

def node_id
  @node_id
end

#pageObject (readonly)

Returns the value of attribute page.



5
6
7
# File 'lib/ferrum/node.rb', line 5

def page
  @page
end

#target_idObject (readonly)

Returns the value of attribute target_id.



5
6
7
# File 'lib/ferrum/node.rb', line 5

def target_id
  @target_id
end

Instance Method Details

#==(other) ⇒ Object



154
155
156
157
158
159
160
# File 'lib/ferrum/node.rb', line 154

def ==(other)
  return false unless other.is_a?(Node)
  # We compare backendNodeId because once nodeId is sent to frontend backend
  # never returns same nodeId sending 0. In other words frontend is
  # responsible for keeping track of node ids.
  target_id == other.target_id && description["backendNodeId"] == other.description["backendNodeId"]
end

#[](name) ⇒ Object



51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/ferrum/node.rb', line 51

def [](name)
  # Although the attribute matters, the property is consistent. Return that in
  # preference to the attribute for links and images.
  if ((tag_name == "img") && (name == "src")) || ((tag_name == "a") && (name == "href"))
    # if attribute exists get the property
    return page_send(:attribute, name) && page_send(:property, name)
  end

  value = property(name)
  value = page_send(:attribute, name) if value.nil? || value.is_a?(Hash)

  value
end

#at_css(selector) ⇒ Object



31
32
33
# File 'lib/ferrum/node.rb', line 31

def at_css(selector)
  page.at_css(selector, within: self)
end

#at_xpath(selector) ⇒ Object



27
28
29
# File 'lib/ferrum/node.rb', line 27

def at_xpath(selector)
  page.at_xpath(selector, within: self)
end

#attributesObject



65
66
67
# File 'lib/ferrum/node.rb', line 65

def attributes
  page_send(:attributes)
end

#checked?Boolean

Returns:

  • (Boolean)


111
112
113
# File 'lib/ferrum/node.rb', line 111

def checked?
  self[:checked]
end

#click(keys = [], offset = {}) ⇒ Object



123
124
125
# File 'lib/ferrum/node.rb', line 123

def click(keys = [], offset = {})
  page_send(:click, keys, offset)
end

#css(selector) ⇒ Object



39
40
41
# File 'lib/ferrum/node.rb', line 39

def css(selector)
  page.css(selector, within: self)
end

#disabled?Boolean

Returns:

  • (Boolean)


119
120
121
# File 'lib/ferrum/node.rb', line 119

def disabled?
  page_send(:disabled?)
end

#double_click(keys = [], offset = {}) ⇒ Object



131
132
133
# File 'lib/ferrum/node.rb', line 131

def double_click(keys = [], offset = {})
  page_send(:double_click, keys, offset)
end

#hoverObject



135
136
137
# File 'lib/ferrum/node.rb', line 135

def hover
  page_send(:hover)
end

#inspectObject



171
172
173
# File 'lib/ferrum/node.rb', line 171

def inspect
  %(#<#{self.class} @target_id=#{@target_id.inspect} @node_id=#{@node_id} @description=#{@description.inspect}>)
end

#node?Boolean

Returns:

  • (Boolean)


12
13
14
# File 'lib/ferrum/node.rb', line 12

def node?
  description["nodeType"] == 1 # nodeType: 3, nodeName: "#text" e.g.
end

#page_send(name, *args) ⇒ Object



16
17
18
19
20
21
22
23
24
25
# File 'lib/ferrum/node.rb', line 16

def page_send(name, *args)
  page.send(name, self, *args)
rescue BrowserError => e
  case e.message
  when "No node with given id found"
    raise ObsoleteNode.new(self, e.response)
  else
    raise
  end
end

#pathObject



167
168
169
# File 'lib/ferrum/node.rb', line 167

def path
  page_send(:path)
end

#property(name) ⇒ Object



47
48
49
# File 'lib/ferrum/node.rb', line 47

def property(name)
  page_send(:property, name)
end

#right_click(keys = [], offset = {}) ⇒ Object



127
128
129
# File 'lib/ferrum/node.rb', line 127

def right_click(keys = [], offset = {})
  page_send(:right_click, keys, offset)
end

#scroll_to(element, location, position = nil) ⇒ Object



143
144
145
146
147
148
149
150
151
152
# File 'lib/ferrum/node.rb', line 143

def scroll_to(element, location, position = nil)
  if element.is_a?(Node)
    scroll_element_to_location(element, location)
  elsif location.is_a?(Symbol)
    scroll_to_location(location)
  else
    scroll_to_coords(*position)
  end
  self
end

#select_optionObject



95
96
97
# File 'lib/ferrum/node.rb', line 95

def select_option
  page_send(:select, true)
end

#selected?Boolean

Returns:

  • (Boolean)


115
116
117
# File 'lib/ferrum/node.rb', line 115

def selected?
  !!self[:selected]
end

#send_keys(*keys) ⇒ Object Also known as: send_key



162
163
164
# File 'lib/ferrum/node.rb', line 162

def send_keys(*keys)
  page_send(:send_keys, keys)
end

#set(value) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/ferrum/node.rb', line 73

def set(value)
  if tag_name == "input"
    case self[:type]
    when "radio"
      click
    when "checkbox"
      click if value != checked?
    when "file"
      files = value.respond_to?(:to_ary) ? value.to_ary.map(&:to_s) : value.to_s
      page_send(:select_file, files)
    else
      page_send(:set, value.to_s)
    end
  elsif tag_name == "textarea"
    page_send(:set, value.to_s)
  elsif self[:isContentEditable]
    # FIXME:
    page_send(:delete_text)
    send_keys(value.to_s)
  end
end

#tag_nameObject



103
104
105
# File 'lib/ferrum/node.rb', line 103

def tag_name
  @tag_name ||= description["nodeName"].downcase
end

#textObject



43
44
45
# File 'lib/ferrum/node.rb', line 43

def text
  page.evaluate_on(node: self, expression: "this.textContent")
end

#trigger(event) ⇒ Object



139
140
141
# File 'lib/ferrum/node.rb', line 139

def trigger(event)
  page_send(:trigger, event)
end

#unselect_optionObject

Raises:



99
100
101
# File 'lib/ferrum/node.rb', line 99

def unselect_option
  raise NotImplemented
end

#valueObject



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

def value
  page.evaluate_on(node: self, expression: "this.value")
end

#visible?Boolean

Returns:

  • (Boolean)


107
108
109
# File 'lib/ferrum/node.rb', line 107

def visible?
  page_send(:visible?)
end

#xpath(selector) ⇒ Object



35
36
37
# File 'lib/ferrum/node.rb', line 35

def xpath(selector)
  page.xpath(selector, within: self)
end