Sha256: 92c429215890473072c7000a3c71bd994f8b013de66d06b324df0966789be291

Contents?: true

Size: 1.96 KB

Versions: 31

Compression:

Stored size: 1.96 KB

Contents

module ToleranceForSeleniumSyncIssues
  RETRY_ERRORS = %w[
    Capybara::ElementNotFound
    Spec::Expectations::ExpectationNotMetError
    RSpec::Expectations::ExpectationNotMetError
    Minitest::Assertion
    Capybara::Poltergeist::ClickFailed
    Capybara::ExpectationNotMet
    Selenium::WebDriver::Error::StaleElementReferenceError
    Selenium::WebDriver::Error::NoAlertPresentError
    Selenium::WebDriver::Error::ElementNotVisibleError
    Selenium::WebDriver::Error::NoSuchFrameError
    Selenium::WebDriver::Error::NoAlertPresentError
    Selenium::WebDriver::Error::JavascriptError
    Selenium::WebDriver::Error::UnknownError
    Selenium::WebDriver::Error::NoSuchAlertError
  ]

  class CapybaraWrapper
    def self.default_max_wait_time
      if Capybara.respond_to?(:default_max_wait_time)
        Capybara.default_max_wait_time
      else
        Capybara.default_wait_time
      end
    end

    def self.default_max_wait_time=(value)
      if Capybara.respond_to?(:default_max_wait_time=)
        Capybara.default_max_wait_time = value
      else
        Capybara.default_wait_time = value
      end
    end
  end

  class Patiently
    WAIT_PERIOD = 0.05

    def patiently(seconds, &block)
      started = Time.now
      tries = 0
      begin
        tries += 1
        block.call
      rescue Exception => e
        raise e unless retryable_error?(e)
        raise e if (Time.now - started > seconds && tries >= 2)
        sleep(WAIT_PERIOD)
        raise Capybara::FrozenInTime, "time appears to be frozen, Capybara does not work with libraries which freeze time, consider using time travelling instead" if Time.now == started
        retry
      end
    end

    private

    def retryable_error?(e)
      RETRY_ERRORS.include?(e.class.name)
    end
  end


  def patiently(seconds = CapybaraWrapper.default_max_wait_time, &block)
    if page.driver.wait?
      Patiently.new.patiently(seconds, &block)
    else
      block.call
    end
  end
end

World(ToleranceForSeleniumSyncIssues)

Version data entries

31 entries across 31 versions & 2 rubygems

Version Path
spreewald-2.5.0 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-2.4.2 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-2.4.0 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-2.3.0 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-2.2.4 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-2.2.3 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-2.2.2 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-2.2.1 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-2.2.0 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-2.1.3 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-2.1.2 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-2.1.1 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-2.1.0 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-2.0.0 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
spreewald-1.12.6 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb
Ifd_Automation-2.9.5 lib/Ifd_Automation/tolerance_for_selenium_sync_issues.rb
Ifd_Automation-2.9.4 lib/Ifd_Automation/tolerance_for_selenium_sync_issues.rb
Ifd_Automation-2.9.2 lib/Ifd_Automation/tolerance_for_selenium_sync_issues.rb
Ifd_Automation-2.9.1 lib/Ifd_Automation/tolerance_for_selenium_sync_issues.rb
spreewald-1.12.5 lib/spreewald_support/tolerance_for_selenium_sync_issues.rb