2012-10-16 105 views
4

我正在使用Capybara(Selenium驅動程序)訪問一些網站上的網頁。我只需點擊數組中的每個項目並點擊返回按鈕。它很好,但每次經過幾次迭代後都會發生。 這裏是代碼:/usr/lib/ruby/1.9.1/net/protocol.rb:146:in`rescue in rbuf_fill':Timeout :: Error(Timeout :: Error)

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 

我有輸出:

的javascript:selectModel( '130254')風格:RB2132 -------------- ------------------------------ javascript:selectModel('309257')風格:RB2140 -------- ------------------------------------ javascript:selectModel('68238')風格:RB3016 - ------------------------------------------ javascript:selectModel('68248')風格:RB3025 -------------------------------------------- javascript: selectModel('68293')風格:RB3026 -------------------------------------------- javascript:selectModel(' 68320')風格: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:in rbuf_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:in readline'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:in read_new'from /usr/lib/ruby/1.9.1/net/http。 rb:1319:在block in transport_request' from /usr/lib/ruby/1.9.1/net/http.rb:1316:in catch'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:in請求'from /usr/lib/ruby/1.9.1/net/http。 rb:1286:在block in request' from /usr/lib/ruby/1.9.1/net/http.rb:745:in開始'從 /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:在 request' from /var/lib/gems/1.9.1/gems/selenium-webdriver-2.25.0/lib/selenium/webdriver/remote/http/common.rb:40:in 呼叫從 '從 /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 執行'/ 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/水豚/節點/ finders.rb:137:在 每個 '從 /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 塊' 從 的/ var/lib中block in first' from /var/lib/gems/1.9.1/gems/capybara-1.1.2/lib/capybara/node/finders.rb:136:in /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 /工作區/ ScrapingGlasses/lib中/ luxottica.rb:39:在block in scrape' from /home/biske/workspace/ScrapingGlasses/lib/luxottica.rb:36:in每個「從/home/biske/workspace/ScrapingGlasses/lib/luxottica.rb:36:in scrape' from /home/biske/workspace/ScrapingGlasses/lib/luxottica.rb:12:in圍棋 從/家/ biske /工作區/ ScrapingGlasses /lib/luxottica.rb:48:in `'

回答

6

我以前見過類似的痕跡和2個潛在原因:

1)geke像FakeWeb和WebMock修改ruby的http。嘗試刪除可能用於模擬/阻止網絡請求的那些寶石和任何類似的寶石。

2)我看到一個真正加載下來的系統中,這種超時會發生一些隨機發生的情況。真的這裏的問題不是測試,而是系統和運行的問題。可以更改http庫使用的超時並繼續測試。

更新了水豚:(從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 

有一個很好的機會,你不需要重新同步的東西。

在這兩種情況下,這與硒如何進行一些內部通信有關。 JsonWireProtocol。

+0

這不是第一例,因爲我不使用這些寶石。 我會嘗試第二種解決方案。 –

+0

我已將Selenium的代碼樣本更新爲Capybara。 Typhoues,Excon&Faraday與WebMock&FakeWeb有一些相似之處。你在使用這些嗎? – tgf

+0

有人指出,重新同步的東西是沒有必要的,可能會導致問題取決於您正在運行的版本。 https://github.com/jnicklas/capybara/issues/717 – tgf

0

我曾與Fakeweb & VCR這個問題,但升級到硒的webdriver(2.27.0)後超時走