Class: Arachni::Browser::ElementLocator

Inherits:
Object
  • Object
show all
Defined in:
lib/arachni/browser/element_locator.rb

Overview

Lazy-loaded, Arachni::Browser element representation.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ ElementLocator



27
28
29
30
# File 'lib/arachni/browser/element_locator.rb', line 27

def initialize( options = {} )
    options.each { |k, v| send( "#{k}=", v ) }
    @attributes ||= {}
end

Instance Attribute Details

#attributesHash



23
24
25
# File 'lib/arachni/browser/element_locator.rb', line 23

def attributes
  @attributes
end

#tag_nameSymbol



19
20
21
# File 'lib/arachni/browser/element_locator.rb', line 19

def tag_name
  @tag_name
end

Class Method Details

.from_html(html) ⇒ Object



111
112
113
# File 'lib/arachni/browser/element_locator.rb', line 111

def self.from_html( html )
    from_node Nokogiri::HTML.fragment( html ).children.first
end

.from_node(node) ⇒ Object



115
116
117
118
119
120
121
122
# File 'lib/arachni/browser/element_locator.rb', line 115

def self.from_node( node )
    attributes = node.attributes.inject({}) do |h, (k, v)|
        h[k.to_s] = v.to_s
        h
    end

    new tag_name: node.name, attributes: attributes
end

.from_rpc_data(data) ⇒ ElementLocator



99
100
101
# File 'lib/arachni/browser/element_locator.rb', line 99

def self.from_rpc_data( data )
    new data
end

.supported_element_attributes_for(tag_name) ⇒ Set<Symbol>



128
129
130
131
132
133
134
135
136
137
138
139
# File 'lib/arachni/browser/element_locator.rb', line 128

def self.supported_element_attributes_for( tag_name )
    @supported_element_attributes_for ||= {}

    tag_name = tag_name.to_sym

    if (klass = Watir.tag_to_class[tag_name])
        @supported_element_attributes_for[tag_name] ||=
            Set.new( klass.attribute_list )
    else
        @supported_element_attributes_for[tag_name] ||= Set.new
    end
end

Instance Method Details

#==(other) ⇒ Object



107
108
109
# File 'lib/arachni/browser/element_locator.rb', line 107

def ==( other )
    hash == other.hash
end

#dupObject



78
79
80
# File 'lib/arachni/browser/element_locator.rb', line 78

def dup
    self.class.new to_h
end

#hashObject



103
104
105
# File 'lib/arachni/browser/element_locator.rb', line 103

def hash
    to_hash.hash
end

#locatable_attributesHash



50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/arachni/browser/element_locator.rb', line 50

def locatable_attributes
    attributes.inject({}) do |h, (k, v)|
        string_key = k.to_s
        attribute  = string_key.gsub( '-' ,'_' ).to_sym

        if !self.class.supported_element_attributes_for( tag_name ).include?( attribute ) &&
            !string_key.start_with?( 'data-' )
            next h
        end

        h[attribute] = v.to_s
        h
    end
end

#locate(browser) ⇒ Watir::HTMLElement



67
68
69
# File 'lib/arachni/browser/element_locator.rb', line 67

def locate( browser )
    browser.watir.send( tag_name, locatable_attributes )
end

#to_hashHash Also known as: to_h



83
84
85
86
87
88
# File 'lib/arachni/browser/element_locator.rb', line 83

def to_hash
    {
        tag_name:   tag_name,
        attributes: attributes
    }
end

#to_rpc_dataHash



93
94
95
# File 'lib/arachni/browser/element_locator.rb', line 93

def to_rpc_data
    to_h.my_stringify_keys
end

#to_sString



73
74
75
76
# File 'lib/arachni/browser/element_locator.rb', line 73

def to_s
    "<#{tag_name}#{' ' if attributes.any?}" <<
        attributes.map { |k, v| "#{k}=#{v.inspect}" }.join( ' ' ) << '>'
end