4
votes

I am using Capybara (Selenium driver) for visiting some pages on the site. I just click on every item in the array and click back button. It goes fine but every time after some number of iterations it brokes. Here is code:

all(:xpath, '//table[@class="griglia_bordata"]//tr[td]/td/a[1]').each do |a|
  a_js_functions << a[:href]
end
a_js_functions.each do |js_for_model|
  puts js_for_model
  page.execute_script js_for_model
  find(:xpath, "//a[text()='Check availability']").click
  puts find(".testo_grande_blu_B").text
  puts "--------------------------------------------"
  find(:xpath, "//a[text()='Back']").click
end

I've got output:

javascript:selectModel('130254') Style: RB2132 -------------------------------------------- javascript:selectModel('309257') Style: RB2140 -------------------------------------------- javascript:selectModel('68238') Style: RB3016 -------------------------------------------- javascript:selectModel('68248') Style: RB3025 -------------------------------------------- javascript:selectModel('68293') Style: RB3026 -------------------------------------------- javascript:selectModel('68320') Style: RB3044 -------------------------------------------- javascript:selectModel('68460') /usr/lib/ruby/1.9.1/net/protocol.rb:146:in rescue in rbuf_fill': Timeout::Error (Timeout::Error) from /usr/lib/ruby/1.9.1/net/protocol.rb:140:inrbuf_fill' from /usr/lib/ruby/1.9.1/net/protocol.rb:122:in readuntil' from /usr/lib/ruby/1.9.1/net/protocol.rb:132:inreadline' from /usr/lib/ruby/1.9.1/net/http.rb:2562:in read_status_line' from /usr/lib/ruby/1.9.1/net/http.rb:2551:inread_new' from /usr/lib/ruby/1.9.1/net/http.rb:1319:in block in transport_request' from /usr/lib/ruby/1.9.1/net/http.rb:1316:incatch' from /usr/lib/ruby/1.9.1/net/http.rb:1316:in transport_request' from /usr/lib/ruby/1.9.1/net/http.rb:1293:inrequest' from /usr/lib/ruby/1.9.1/net/http.rb:1286:in block in request' from /usr/lib/ruby/1.9.1/net/http.rb:745:instart' from /usr/lib/ruby/1.9.1/net/http.rb:1284:in request' from /var/lib/gems/1.9.1/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/remote/http/default.rb:82:in response_for' from /var/lib/gems/1.9.1/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/remote/http/default.rb:38:in request' from /var/lib/gems/1.9.1/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/remote/http/common.rb:40:in call' from /var/lib/gems/1.9.1/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/remote/bridge.rb:598:in raw_execute' from /var/lib/gems/1.9.1/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/remote/bridge.rb:576:in execute' from /var/lib/gems/1.9.1/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/remote/bridge.rb:554:in find_elements_by' from /var/lib/gems/1.9.1/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/common/search_context.rb:62:in find_elements' from /var/lib/gems/1.9.1/gems/capybara-1.1.2/lib/capybara/selenium/driver.rb:52:in find' from /var/lib/gems/1.9.1/gems/capybara-1.1.2/lib/capybara/node/finders.rb:158:in find_in_base' from /var/lib/gems/1.9.1/gems/capybara-1.1.2/lib/capybara/node/finders.rb:137:in block in first' from /var/lib/gems/1.9.1/gems/capybara-1.1.2/lib/capybara/node/finders.rb:136:in each' from /var/lib/gems/1.9.1/gems/capybara-1.1.2/lib/capybara/node/finders.rb:136:in first' from /var/lib/gems/1.9.1/gems/capybara-1.1.2/lib/capybara/node/finders.rb:27:in block in find' from /var/lib/gems/1.9.1/gems/capybara-1.1.2/lib/capybara/node/base.rb:46:in wait_until' from /var/lib/gems/1.9.1/gems/capybara-1.1.2/lib/capybara/node/finders.rb:27:in find' from (eval):2:in find' from /var/lib/gems/1.9.1/gems/capybara-1.1.2/lib/capybara/dsl.rb:161:in find' from /home/biske/workspace/ScrapingGlasses/lib/luxottica.rb:39:in block in scrape' from /home/biske/workspace/ScrapingGlasses/lib/luxottica.rb:36:ineach' from /home/biske/workspace/ScrapingGlasses/lib/luxottica.rb:36:in scrape' from /home/biske/workspace/ScrapingGlasses/lib/luxottica.rb:12:ingo' from /home/biske/workspace/ScrapingGlasses/lib/luxottica.rb:48:in `'

2

2 Answers

6
votes

I've seen a similar trace before and 2 potential causes for it:

1) gems like FakeWeb and WebMock modify ruby's http. Try removing those gems and any similar ones you may be using to mock/block web requests.

2) I've seen a case in a really loaded down system where this timeout would occur somewhat randomly. Really the issue here wasn't the test but the system and what was running on it. It's possible to change the timeout used by the http library and continue testing.

Updated for Capybara: (from http://selenium.googlecode.com/svn/wiki/RubyBindings.wiki)

Capybara.register_driver :selenium_extended_http_timeout do |app|
    client = Selenium::WebDriver::Remote::Http::Default.new
    client.timeout = 240
    Capybara::Selenium::Driver.new(app, 
                               :browser => :firefox, 
                               :http_client => client, 
                               :resynchronization_timeout => 60,
                               :resynchronize => true)                                                                   
end
Capybara.javascript_driver = :selenium_extended_http_timeout

There's a good chance you don't need the resynchronization stuff.

In both cases this is related to how selenium does some of its internal communications. The JsonWireProtocol.

0
votes

I had this issue with Fakeweb & VCR but after upgrading to selenium-webdriver (2.27.0) the timeouts went away