Sha256: 0257e7641e997a11c9539b17412d27d13add575610ad1002d62f6ad092667b71

Contents?: true

Size: 1.67 KB

Versions: 2

Compression:

Stored size: 1.67 KB

Contents

require 'napybara'

module Napybara
  class Element
    attr_reader :capybara_element
    alias_method :get, :capybara_element

    def initialize(capybara_element, &block)
      @capybara_element = capybara_element
      block.call(self) if block_given?
    end

    def finder(child_element_name, child_element_selector, record_selector = nil, &block)
      self.define_singleton_method(child_element_name) do |record = nil|
        selector = Selector.new(child_element_selector, record_selector, record)
        self.class.new(self.get.find(selector.to_s), &block)
      end

      self.define_singleton_method("has_#{child_element_name}?") do |record = nil|
        selector = Selector.new(child_element_selector, record_selector, record)
        self.get.has_css?(selector.to_s)
      end

      self.define_singleton_method("has_no_#{child_element_name}?") do |record = nil|
        selector = Selector.new(child_element_selector, record_selector, record)
        self.get.has_no_css?(selector.to_s)
      end

      self.define_singleton_method(child_element_name.to_s.pluralize) do
        self.get.all(child_element_selector).map do |child_element|
          self.class.new(child_element, &block)
        end
      end
    end

    class Selector < Struct.new(:child_element_selector, :record_selector, :record)
      METHOD_NAME_REGEX = /\{(\w+)\}/
      def method_name
        record_selector.match(METHOD_NAME_REGEX)[1]
      end

      def record_id
        record && record.public_send(method_name)
      end

      def to_s
        if record
          record_selector.gsub(METHOD_NAME_REGEX, record_id.to_s)
        else
          child_element_selector
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
napybara-0.4.1 lib/napybara/element.rb
napybara-0.4.0 lib/napybara/element.rb