簡體   English   中英

Watir:通過啟動chrome瀏覽器有時會出現Net :: ReadTimeout錯誤

[英]Watir: get sometimes a Net::ReadTimeout error by launching chrome browser

我只是使用watir腳本從服務器下載順序狀態信息。 在大多數情況下它工作正常,但有時我得到一個Net :: ReadTimeout錯誤。 我不知道為什么?

碼:

require "rubygems"
require "watir"
Watir.default_timeout = 180     # seconds – default is 60
prefs = { :download => { :prompt_for_download => false, :default_directory => path } }
browser = Watir::Browser.new :chrome, :switches => %w[--no-sandbox], :prefs => prefs
browser.goto 'https://www...'
...

錯誤信息:

/usr/lib/ruby/2.3.0/net/protocol.rb:158:in `rbuf_fill': Net::ReadTimeout (Net::ReadTimeout)   
    from /usr/lib/ruby/2.3.0/net/protocol.rb:136:in `readuntil' 
    from /usr/lib/ruby/2.3.0/net/protocol.rb:146:in `readline'  
    from /usr/lib/ruby/2.3.0/net/http/response.rb:40:in `read_status_line'
    from /usr/lib/ruby/2.3.0/net/http/response.rb:29:in `read_new'
    from /usr/lib/ruby/2.3.0/net/http.rb:1437:in `block in transport_request'  
    from /usr/lib/ruby/2.3.0/net/http.rb:1434:in `catch'
    from /usr/lib/ruby/2.3.0/net/http.rb:1434:in `transport_request'from /usr/lib/ruby/2.3.0/net/http.rb:1407:in `request'
    from /usr/lib/ruby/2.3.0/net/http.rb:1400:in `block in request'
    from /usr/lib/ruby/2.3.0/net/http.rb:853:in `start' 
    from /usr/lib/ruby/2.3.0/net/http.rb:1398:in `request'
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.1/lib/selenium/webdriver/remote/http/default.rb:103:in `response_for'
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.1/lib/selenium/webdriver/remote/http/default.rb:57:in `request' 
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.1/lib/selenium/webdriver/remote/http/common.rb:59:in `call'   
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.1/lib/selenium/webdriver/remote/bridge.rb:653:in `raw_execute'
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.1/lib/selenium/webdriver/remote/bridge.rb:124:in `create_session'
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.1/lib/selenium/webdriver/remote/bridge.rb:88:in `initialize'  
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.1/lib/selenium/webdriver/chrome/bridge.rb:41:in `initialize'  
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.1/lib/selenium/webdriver/common/driver.rb:61:in `new'  
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.1/lib/selenium/webdriver/common/driver.rb:61:in `for' 
    from /var/lib/gems/2.3.0/gems/selenium-webdriver-3.0.1/lib/selenium/webdriver.rb:82:in `for'
    from /var/lib/gems/2.3.0/gems/watir-6.0.2/lib/watir/browser.rb:46:in `initialize'   
    from /var/www/jobs/ubuntu.rb:110:in `new'from /var/www/jobs/ubuntu.rb:5:in `<main>'

我只是在尋找一個理由嗎?

是否有可能在Firefox上自定義設置? 怎么了?

  • Watir版本:6.0.2
  • Selenium版本:3.0.1
  • 瀏覽器Chrome版本:57.0.2987.110
  • Chrome驅動程序版本:2.29.461571
  • 操作系統版本:Ubuntu 16.04.3 LTS

在我們的Ubuntu Jenkins構建服務器上運行Selenium Webdriver測試時遇到了類似的問題,但我從未在Windows PC上本地體驗過這個問題。 像你的問題,這是一個間歇性的問題。 我花了很多時間研究它並且無法深究它,但我把它歸結為Ruby / Ubuntu問題而不是測試問題,因此,我決定拯救網絡:: ReadTimeout錯誤並重試。 自從實現以下示例以來,我再沒有遇到過這個問題。

     attempts = 0  # has to be outside the begin/rescue to avoid infinite loop
  begin
  profile = Selenium::WebDriver::Chrome::Profile.new
  $driver = Selenium::WebDriver.for :chrome, :profile => profile,
  $driver.manage.window.resize_to(1280, 720)
  rescue Net::ReadTimeout => e
    if attempts == 0
      attempts += 1
      retry
    else
      raise
    end
  end

您應該能夠簡單地修改上面的示例以使用Watir。 它基本上捕獲錯誤並重試/重新運行測試。

首先, Watir.default_timeout與你所說的錯誤無關,所以即使你增加default_timeout的時間,在這個地方也不會發生任何事情, Watir.default_timeout僅在你找到一個元素時適用,而不適用於page_load。

第二個,這個問題只存在於Ruby Selenium Binding中,而不是在Java Selenium Binding中,例如,如果你設置了

driver.manage.timeouts.page_load=120 (WATIR doesn't provide any systax to this selenium equivalent, so to write this code in WATIR, please invoke b.driver.)

此時間設置僅適用於goto方法,當您單擊按鈕並等待頁面加載時它不會影響任何內容,page_load的默認超時為60秒,無論如何等待60秒,但您設置的不是影響或改變這60秒。 但是這個問題不適用於Selenium Java Binding,它運行正常。

好的,問題是,你正在使用goto ,為什么不能使用page_load來設置時間呢?

實際上你可以減少時間,但你不能將時間增加到超過60秒。 但我找到了解決此問題的一些方法,但我強烈建議您在ruby selenium綁定中提交一個錯誤。

所以它不是WATIR問題,而是Ruby selenium綁定中的問題。

最后我用firefox測試了解決方案並得到了描述的錯誤:

/var/lib/gems/2.1.0/gems/selenium-webdriver-3.0.1/lib/seleni‌​um/webdriver/remote/‌​response.rb:69:in 'assert_ok': 
TypeError: Given platformVersion [object String] "any", but current platform version is [object String] "3.16.0-4-amd64"
(Selenium::WebDriver::Error::SessionNotCreatedError)

這似乎是一個特定的Firefox和geckodriver版本的問題。 我測試了很多組合。 此版本在沒有TypeError的情況下工作:

  • Firefox 51.0.1
  • geckodriver 0.11.1

感謝dan.brown

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM