Module: OmniAI::Tools::Browser::SelectorGenerator

Extended by:
BaseSelectors, ContextualSelectors
Defined in:
lib/omniai/tools/browser/selector_generator.rb,
lib/omniai/tools/browser/selector_generator/base_selectors.rb,
lib/omniai/tools/browser/selector_generator/contextual_selectors.rb

Overview

Generates stable CSS selectors for HTML elements

Defined Under Namespace

Modules: BaseSelectors, ContextualSelectors

Class Method Summary collapse

Methods included from BaseSelectors

aria_label_selector, maxlength_selector, name_selector, placeholder_selector

Methods included from ContextualSelectors

build_parent_selector, build_position_selector, element_has_significant_class?, find_label_for_element, find_significant_parent, find_similar_siblings, generate_contextual_selectors, generic_class?, label_based_selectors, most_specific_class, parent_class_selectors, parent_context_prefix, position_based_selectors, same_key_attributes?, significant_class?, stable_id?

Class Method Details

.amount_class_selector(base, element) ⇒ Object



59
60
61
# File 'lib/omniai/tools/browser/selector_generator.rb', line 59

def amount_class_selector(base, element)
  element["class"]&.include?("wv-input--amount") ? "#{base}.wv-input--amount" : nil
end

.attribute_selectors(element, tag) ⇒ Object



63
64
65
# File 'lib/omniai/tools/browser/selector_generator.rb', line 63

def attribute_selectors(element, tag)
  maxlength_selector(element, tag) + name_selector(element, tag)
end

.generate_by_type(element) ⇒ Object



22
23
24
25
26
27
28
29
# File 'lib/omniai/tools/browser/selector_generator.rb', line 22

def generate_by_type(element)
  case element.name
  when "input" then generate_input_selectors(element)
  when "textarea" then generate_textarea_selectors(element)
  when "select" then generate_select_selectors(element)
  else []
  end
end

.generate_input_selectors(element) ⇒ Object



35
36
37
38
39
40
41
42
# File 'lib/omniai/tools/browser/selector_generator.rb', line 35

def generate_input_selectors(element)
  selectors = []
  selectors.concat(placeholder_selector(element, "input"))
  selectors.concat(aria_label_selector(element, "input"))
  selectors.concat(type_selectors(element))
  selectors.concat(attribute_selectors(element, "input"))
  selectors
end

.generate_select_selectors(element) ⇒ Object



48
49
50
# File 'lib/omniai/tools/browser/selector_generator.rb', line 48

def generate_select_selectors(element)
  name_selector(element, "select") + aria_label_selector(element, "select")
end

.generate_stable_selectors(element) ⇒ Object



13
14
15
16
17
18
19
20
# File 'lib/omniai/tools/browser/selector_generator.rb', line 13

def generate_stable_selectors(element)
  return [] unless valid_element?(element)

  selectors = []
  selectors.concat(generate_by_type(element))
  selectors.concat(generate_contextual_selectors(element))
  selectors.compact.uniq
end

.generate_textarea_selectors(element) ⇒ Object



44
45
46
# File 'lib/omniai/tools/browser/selector_generator.rb', line 44

def generate_textarea_selectors(element)
  placeholder_selector(element, "textarea") + name_selector(element, "textarea")
end

.type_selectors(element) ⇒ Object



52
53
54
55
56
57
# File 'lib/omniai/tools/browser/selector_generator.rb', line 52

def type_selectors(element)
  return [] unless valid_attribute?(element["type"])

  base = "input[type=\"#{element['type']}\"]"
  [base, amount_class_selector(base, element)].compact
end

.valid_attribute?(attribute) ⇒ Boolean

Returns:

  • (Boolean)


67
68
69
# File 'lib/omniai/tools/browser/selector_generator.rb', line 67

def valid_attribute?(attribute)
  attribute && attribute.strip.length.positive?
end

.valid_element?(element) ⇒ Boolean

Returns:

  • (Boolean)


31
32
33
# File 'lib/omniai/tools/browser/selector_generator.rb', line 31

def valid_element?(element)
  element.respond_to?(:name) && element.respond_to?(:parent)
end