Module: WildcardFinders::Finders

Included in:
Capybara::Node::Base
Defined in:
lib/wildcard_finders/finders.rb

Constant Summary collapse

METHODS =
[]

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.method_added(name) ⇒ Object



54
55
56
# File 'lib/wildcard_finders/finders.rb', line 54

def self.method_added(name)
  METHODS.push(name)
end

Instance Method Details

#find_exactly(tag, matcher) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/wildcard_finders/finders.rb', line 35

def find_exactly(tag, matcher)
  xpath = XPath.generate do |x|
    attr_matcher = matcher.map do |key, value|
      case key
      when :text
        x.text.equals(value)
      when :class
        x.attr(:class).contains(value)
      else
        x.attr(key).equals(value)
      end
    end

    x.descendant(tag.to_sym)[attr_matcher.inject(&:&)]
  end

  find(:xpath, xpath)
end

#find_tag_like(tag, matcher = nil, opts = {}, &block) ⇒ Object

not to add METHODS FIXME: opts is not used. what was that?



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/wildcard_finders/finders.rb', line 10

def find_tag_like(tag, matcher = nil, opts = {}, &block)
  if matcher.is_a?(Hash) && matcher.values.all? {|v| v.is_a?(String) }
    find_exactly(tag, matcher)
  else
    wait_method = respond_to?(:synchronize) ? :synchronize : :wait_until

    results = []
    __send__(wait_method) do
      results = all(tag).select do |element|
        if matcher.is_a?(Hash)
          hash_from_element = matcher.keys.each_with_object({}) {|key, h| h[key] = element[key] }
          WildcardMatchers.wildcard_match?(hash_from_element, matcher)
        else
          WildcardMatchers.wildcard_match?(element, block || matcher)
        end
      end

      raise Capybara::ElementNotFound, "no <#{tag}> to match #{matcher}" if results.empty?
    end

    # not compatible for capybara 2.0
    results.first
  end
end