Sha256: 1b77a91e836fccf168b7d5bf138b5a8b092be99a77d4306f9295bf13dc114fe4

Contents?: true

Size: 1.76 KB

Versions: 2

Compression:

Stored size: 1.76 KB

Contents

require 'capybara'

module Capybara
  class TimeoutReporter

    @exclude_patterns = [/capybara-timeout_reporter/, /gems\/capybara\//]
    @include_patterns = [/.*/]

    class << self
      attr_accessor :exclude_patterns
      attr_accessor :include_patterns

      def on_timeout(&block)
        @block = block
      end

      def report(seconds, src_line)
        @block.call(seconds, src_line)
      end

      def default_wait_time
        Capybara.respond_to?(:default_max_wait_time) ? Capybara.default_max_wait_time : Capybara.default_wait_time
      end
    end

    on_timeout do |seconds, src_line|
      puts "[WARNING] Capybara find timed out after #{seconds} seconds in #{src_line}"
    end
  end

  module Node
    class Base
      def synchronize_with_warning(seconds=Capybara::TimeoutReporter.default_wait_time, options = {}, &block)
        start_time = Time.now
        synchronize_without_warning(seconds, options, &block)
      rescue Capybara::ElementNotFound => e
        if Time.now-start_time > seconds
          backtrace = Thread.current.backtrace
          Capybara::TimeoutReporter.exclude_patterns.each do |pattern|
            backtrace.reject! { |line| line =~ pattern }
          end
          backtrace.select! do |line|
            Capybara::TimeoutReporter.include_patterns.any? { |pattern| (line =~ pattern) }
          end
          trace_line = backtrace.length > 0 ? backtrace[0] : nil
          src_line = trace_line ? trace_line.match(/(.*):.*/).captures.first : "Can't find line that matches the pattern"
          Capybara::TimeoutReporter.report(seconds, src_line) if src_line
        end
        raise e
      end

      alias_method :synchronize_without_warning, :synchronize
      alias_method :synchronize, :synchronize_with_warning
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
capybara-timeout_reporter-0.2.1 lib/capybara/timeout_reporter.rb
capybara-timeout_reporter-0.2.0 lib/capybara/timeout_reporter.rb