Class: Ferrum::Node
- Inherits:
-
Object
- Object
- Ferrum::Node
- Defined in:
- lib/ferrum/node.rb
Instance Attribute Summary collapse
-
#description ⇒ Object
readonly
Returns the value of attribute description.
-
#node_id ⇒ Object
readonly
Returns the value of attribute node_id.
-
#page ⇒ Object
readonly
Returns the value of attribute page.
-
#target_id ⇒ Object
readonly
Returns the value of attribute target_id.
Instance Method Summary collapse
- #==(other) ⇒ Object
- #[](name) ⇒ Object
- #at_css(selector) ⇒ Object
- #at_xpath(selector) ⇒ Object
- #attributes ⇒ Object
- #checked? ⇒ Boolean
- #click(keys = [], offset = {}) ⇒ Object
- #css(selector) ⇒ Object
- #disabled? ⇒ Boolean
- #double_click(keys = [], offset = {}) ⇒ Object
- #hover ⇒ Object
-
#initialize(page, target_id, node_id, description) ⇒ Node
constructor
A new instance of Node.
- #inspect ⇒ Object
- #node? ⇒ Boolean
- #page_send(name, *args) ⇒ Object
- #path ⇒ Object
- #property(name) ⇒ Object
- #right_click(keys = [], offset = {}) ⇒ Object
- #scroll_to(element, location, position = nil) ⇒ Object
- #select_option ⇒ Object
- #selected? ⇒ Boolean
- #send_keys(*keys) ⇒ Object (also: #send_key)
- #set(value) ⇒ Object
- #tag_name ⇒ Object
- #text ⇒ Object
- #trigger(event) ⇒ Object
- #unselect_option ⇒ Object
- #value ⇒ Object
- #visible? ⇒ Boolean
- #xpath(selector) ⇒ Object
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
#description ⇒ Object (readonly)
Returns the value of attribute description.
5 6 7 |
# File 'lib/ferrum/node.rb', line 5 def description @description end |
#node_id ⇒ Object (readonly)
Returns the value of attribute node_id.
5 6 7 |
# File 'lib/ferrum/node.rb', line 5 def node_id @node_id end |
#page ⇒ Object (readonly)
Returns the value of attribute page.
5 6 7 |
# File 'lib/ferrum/node.rb', line 5 def page @page end |
#target_id ⇒ Object (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 |
#attributes ⇒ Object
65 66 67 |
# File 'lib/ferrum/node.rb', line 65 def attributes page_send(:attributes) end |
#checked? ⇒ 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
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 |
#hover ⇒ Object
135 136 137 |
# File 'lib/ferrum/node.rb', line 135 def hover page_send(:hover) end |
#inspect ⇒ Object
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
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. when "No node with given id found" raise ObsoleteNode.new(self, e.response) else raise end end |
#path ⇒ Object
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_option ⇒ Object
95 96 97 |
# File 'lib/ferrum/node.rb', line 95 def select_option page_send(:select, true) end |
#selected? ⇒ 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_name ⇒ Object
103 104 105 |
# File 'lib/ferrum/node.rb', line 103 def tag_name @tag_name ||= description["nodeName"].downcase end |
#text ⇒ Object
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_option ⇒ Object
99 100 101 |
# File 'lib/ferrum/node.rb', line 99 def unselect_option raise NotImplemented end |
#value ⇒ Object
69 70 71 |
# File 'lib/ferrum/node.rb', line 69 def value page.evaluate_on(node: self, expression: "this.value") end |
#visible? ⇒ 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 |