4

サイトのいくつかのページにアクセスするために Capybara (Selenium ドライバー) を使用しています。配列内のすべての項目をクリックして、戻るボタンをクリックするだけです。うまくいきますが、何度か繰り返した後、毎回壊れます。コードは次のとおりです。

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: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:で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 から /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 `'

4

2 に答える 2

6

以前に同様のトレースを見たことがありますが、2 つの潜在的な原因があります。

1) FakeWeb や WebMock などの gem は ruby​​ の http を変更します。これらの gem や、Web リクエストのモック/ブロックに使用している可能性のある同様の gem を削除してみてください。

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

再同期が必要ない可能性は十分にあります。

どちらの場合も、これはセレンが内部通信の一部を行う方法に関連しています。JsonWire プロトコル。

于 2012-10-20T00:52:48.920 に答える
0

Fakeweb & VCR でこの問題が発生しましたが、selenium-webdriver (2.27.0) にアップグレードした後、タイムアウトはなくなりました

于 2012-12-08T16:00:50.620 に答える