Sha256: 9aa029f1e48233a3c3110516684a9888e98e39b4309d850fdc4caf97db529b19

Contents?: true

Size: 1.43 KB

Versions: 1

Compression:

Stored size: 1.43 KB

Contents

require 'capybara/dsl'
require_relative 'actions'
require_relative 'exceptions'

module Prickle
  module Capybara
    class Element

      include ::Capybara::DSL

      OF_ANY_TYPE = "*"
      CONVERTED_TYPES = { :link => 'a',
                          :paragraph => 'p'
                        }

      private

      def initialize type=OF_ANY_TYPE, identifier
        @identifier = identifier
        @type = type
        self
      end

      def find_element
        handle_exception { find_element_by xpath }
      end

      def find_element_by xpath
        wait_until(Prickle::Capybara.wait_time) do
          find(:xpath, xpath).visible?
        end unless Prickle::Capybara.wait_time.nil?

        find(:xpath, xpath)
      end

      def handle_exception &block
        begin
          block.call
        rescue Exception => e
          error_message = Error.new(@type, @identifier, @text, e).message
          raise ElementNotFound, error_message if e.class.to_s == "Capybara::ElementNotFound"
          raise
        end
      end

      def identifier
        return @identifier.each_pair.to_a.map { |k, v| "@#{k}='#{v}'" }.join " and "
      end

      def type
        CONVERTED_TYPES[@type.to_sym] || @type
      end

      def xpath
        xpath = "//#{type}[#{identifier}"
        xpath << " and contains(text(), '#{@text}')" if @text
        xpath << "]"
      end

      public

      include Prickle::Capybara::Actions

    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
prickle-0.0.3 lib/prickle/capybara/element.rb