Class: Puppeteer::Accessibility::AXNode
- Inherits:
-
Object
- Object
- Puppeteer::Accessibility::AXNode
- Defined in:
- lib/puppeteer/accessibility.rb,
sig/puppeteer/accessibility.rbs
Constant Summary collapse
- CONTROL_ROLES =
Set.new(%w[ button checkbox ColorWell combobox DisclosureTriangle listbox menu menubar menuitem menuitemcheckbox menuitemradio radio scrollbar searchbox slider spinbutton switch tab textbox tree treeitem ]).freeze
- LANDMARK_ROLES =
Set.new(%w[ banner complementary contentinfo form main navigation region search ]).freeze
- LEAF_ROLES =
Set.new(%w[ doc-cover graphics-symbol img image Meter scrollbar slider separator progressbar ]).freeze
- TEXT_ROLES =
Set.new(%w[LineBreak text InlineTextBox StaticText]).freeze
Instance Attribute Summary collapse
-
#children ⇒ Object
readonly
Returns the value of attribute children.
-
#iframe_snapshot ⇒ Object
Returns the value of attribute iframe_snapshot.
-
#payload ⇒ Object
readonly
Returns the value of attribute payload.
-
#role ⇒ Object
readonly
Returns the value of attribute role.
Class Method Summary collapse
Instance Method Summary collapse
- #control? ⇒ Boolean
- #find(&predicate) ⇒ void
- #initialize(frame, payload) ⇒ Object constructor
- #interesting?(inside_control) ⇒ Boolean
- #landmark? ⇒ Boolean
- #leaf_node? ⇒ Boolean
- #serialize ⇒ Object
Constructor Details
#initialize(frame, payload) ⇒ Object
126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 |
# File 'lib/puppeteer/accessibility.rb', line 126 def initialize(frame, payload) @frame = frame @payload = payload @children = [] @iframe_snapshot = nil @role = payload.dig('role', 'value') || 'Unknown' @ignored = payload['ignored'] @name = payload.dig('name', 'value') || '' @description = payload.dig('description', 'value') @richly_editable = false @editable = false @focusable = false @hidden = false @busy = false @modal = false @has_error_message = false @has_details = false @role_description = nil @live = nil @cached_has_focusable_child = nil read_properties end |
Instance Attribute Details
#children ⇒ Object (readonly)
Returns the value of attribute children.
149 150 151 |
# File 'lib/puppeteer/accessibility.rb', line 149 def children @children end |
#iframe_snapshot ⇒ Object
Returns the value of attribute iframe_snapshot.
150 151 152 |
# File 'lib/puppeteer/accessibility.rb', line 150 def iframe_snapshot @iframe_snapshot end |
#payload ⇒ Object (readonly)
Returns the value of attribute payload.
149 150 151 |
# File 'lib/puppeteer/accessibility.rb', line 149 def payload @payload end |
#role ⇒ Object (readonly)
Returns the value of attribute role.
149 150 151 |
# File 'lib/puppeteer/accessibility.rb', line 149 def role @role end |
Class Method Details
.create_tree(frame, payloads) ⇒ Object
237 238 239 240 241 242 243 244 245 246 247 248 249 |
# File 'lib/puppeteer/accessibility.rb', line 237 def self.create_tree(frame, payloads) nodes_by_id = {} payloads.each do |payload| nodes_by_id[payload['nodeId']] = new(frame, payload) end nodes_by_id.each_value do |node| node.payload.fetch('childIds', []).each do |child_id| child = nodes_by_id[child_id] node.children << child if child end end nodes_by_id.each_value.first end |
Instance Method Details
#control? ⇒ Boolean
172 173 174 |
# File 'lib/puppeteer/accessibility.rb', line 172 def control? CONTROL_ROLES.include?(@role) end |
#find(&predicate) ⇒ void
This method returns an undefined value.
152 153 154 155 156 157 158 159 160 |
# File 'lib/puppeteer/accessibility.rb', line 152 def find(&predicate) return self if predicate.call(self) @children.each do |child| result = child.find(&predicate) return result if result end nil end |
#interesting?(inside_control) ⇒ Boolean
180 181 182 183 184 185 186 187 188 189 190 |
# File 'lib/puppeteer/accessibility.rb', line 180 def interesting?(inside_control) return false if @role == 'Ignored' || @hidden || @ignored return true if landmark? return true if @focusable || @richly_editable || @busy return true if @live && @live != 'off' return true if @modal || @has_error_message || @has_details || @role_description return true if control? return false if inside_control leaf_node? && (!@name.empty? || !@description.to_s.empty?) end |
#landmark? ⇒ Boolean
176 177 178 |
# File 'lib/puppeteer/accessibility.rb', line 176 def landmark? LANDMARK_ROLES.include?(@role) end |
#leaf_node? ⇒ Boolean
162 163 164 165 166 167 168 169 170 |
# File 'lib/puppeteer/accessibility.rb', line 162 def leaf_node? return true if @children.empty? return true if plain_text_field? || TEXT_ROLES.include?(@role) return true if LEAF_ROLES.include?(@role) return false if has_focusable_child? return true if @role == 'heading' && !@name.empty? false end |
#serialize ⇒ Object
192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 |
# File 'lib/puppeteer/accessibility.rb', line 192 def serialize properties = {} @payload.fetch('properties', []).each do |property| properties[property['name'].downcase] = property.dig('value', 'value') end properties['name'] = @payload.dig('name', 'value') if @payload['name'] properties['value'] = @payload.dig('value', 'value') if @payload['value'] if @payload['description'] properties['description'] = @payload.dig('description', 'value') end values = { 'role' => @role, 'backendNodeId' => @payload['backendDOMNodeId'], 'loaderId' => @frame.loader_id, } %w[name value description keyshortcuts roledescription valuetext url].each do |key| values[key] = properties[key] if properties.key?(key) end %w[ disabled expanded focused modal multiline multiselectable readonly required selected busy atomic ].each do |key| next if key == 'focused' && @role == 'RootWebArea' values[key] = !!properties[key] if properties.key?(key) end %w[checked pressed].each do |key| next unless properties.key?(key) value = properties[key] values[key] = value == 'mixed' ? 'mixed' : value == 'true' end %w[level valuemax valuemin].each do |key| values[key] = properties[key] if properties.key?(key) end %w[ autocomplete haspopup invalid orientation live relevant errormessage details ].each do |key| value = properties[key] values[key] = value if value && value != 'false' end values.delete_if { |_key, value| value.nil? } SerializedAXNode.new(values, method(:element_handle)) end |