Class: Puppeteer::Accessibility::AXNode

Inherits:
Object
  • Object
show all
Defined in:
lib/puppeteer/accessibility.rb,
sig/puppeteer/accessibility.rbs

Constant Summary collapse

CONTROL_ROLES =

Returns:

  • (Object)
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 =

Returns:

  • (Object)
Set.new(%w[
  banner complementary contentinfo form main navigation region search
]).freeze
LEAF_ROLES =

Returns:

  • (Object)
Set.new(%w[
  doc-cover graphics-symbol img image Meter scrollbar slider separator progressbar
]).freeze
TEXT_ROLES =

Returns:

  • (Object)
Set.new(%w[LineBreak text InlineTextBox StaticText]).freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(frame, payload) ⇒ Object

Parameters:



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

#childrenObject (readonly)

Returns the value of attribute children.

Returns:

  • (Object)


149
150
151
# File 'lib/puppeteer/accessibility.rb', line 149

def children
  @children
end

#iframe_snapshotObject

Returns the value of attribute iframe_snapshot.

Returns:

  • (Object)


150
151
152
# File 'lib/puppeteer/accessibility.rb', line 150

def iframe_snapshot
  @iframe_snapshot
end

#payloadObject (readonly)

Returns the value of attribute payload.

Returns:

  • (Object)


149
150
151
# File 'lib/puppeteer/accessibility.rb', line 149

def payload
  @payload
end

#roleObject (readonly)

Returns the value of attribute role.

Returns:

  • (Object)


149
150
151
# File 'lib/puppeteer/accessibility.rb', line 149

def role
  @role
end

Class Method Details

.create_tree(frame, payloads) ⇒ Object

Parameters:

  • frame (Object)
  • payloads (Object)

Returns:

  • (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

Returns:

  • (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

Parameters:

  • inside_control (Object)

Returns:

  • (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

Returns:

  • (Boolean)


176
177
178
# File 'lib/puppeteer/accessibility.rb', line 176

def landmark?
  LANDMARK_ROLES.include?(@role)
end

#leaf_node?Boolean

Returns:

  • (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

#serializeObject

Returns:

  • (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