0

Can someone please give me a example of how to use rspec-retry with the selenium-webdriver. I am trying to get it to reattempt the navigation when there is a Net::ReadTimeout error. I found an example here but I am new to Ruby and don't think I am using it right.

What I have tried.

require 'selenium-webdriver'
require 'rspec/retry'

Selenium::WebDriver::PhantomJS.path = 'phantomjs.exe'
driver = Selenium::WebDriver.for :phantomjs
driver.manage.timeouts.page_load = 300

driver.navigate.to "http://google.com"

RSpec.configure do |config|
  # show retry status in spec process
  config.verbose_retry = true
  # Try five times (retry 4 times)
  config.default_retry_count = 5
  # Only retry when Selenium raises Net::ReadTimeout
  config.exceptions_to_retry = [Net::ReadTimeout]
end

puts(driver.title)
driver.quit
Community
  • 1
  • 1
MrAutoIt
  • 785
  • 6
  • 21
  • What do you see in your test log when it fails? Are you sure it isn't retrying and failing repeatedly? – Dave Schweisguth Feb 23 '16 at 22:02
  • I don't know how to have it write to a test log so no I am not sure it is retrying and failing. – MrAutoIt Feb 23 '16 at 22:07
  • Maybe you should add more info to your question. Are you testing a Rails app with rspec-rails, or are you testing a remote application? – Dave Schweisguth Feb 23 '16 at 22:09
  • I am using pure Ruby and the code above. The only deference is that I am navigating to 100 or so URL's. The above code works 90% of the time but then randomly crashes with a Net::ReadTimeout error. I am simply trying to stop it from crashing on the error and have re-navigate to the URL. When I restart the code after a crash it seems to navigate just fine to the same URL. – MrAutoIt Feb 23 '16 at 22:16

1 Answers1

4

It sounds like you may not be using rspec at all, but just want the retry behavior that is provided by the rspec-retry gem. If that's the case, you could just use ruby's rescue and retry keywords to achieve the same thing.

For example, the following code will retry the navigation 1 time if the navigation throws a Net::ReadTimeout

require 'selenium-webdriver'

Selenium::WebDriver::PhantomJS.path = 'phantomjs.exe'
driver = Selenium::WebDriver.for :phantomjs
driver.manage.timeouts.page_load = 300

attempts = 0  # has to be outside the begin/rescue to avoid infinite loop
begin
  driver.navigate.to "http://google.com"
rescue Net::ReadTimeout => e
  if attempts == 0
    attempts += 1
    retry
  else
    raise
  end
end
J. Levine
  • 58
  • 1
  • 3
Dhruv
  • 1,380
  • 12
  • 20