首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Watir:有时通过启动chrome浏览器获得一个Net::ReadTimeout错误

Watir:有时通过启动chrome浏览器获得一个Net::ReadTimeout错误
EN

Stack Overflow用户
提问于 2017-11-23 01:46:36
回答 3查看 3.7K关注 0票数 3

我只是使用watir脚本从服务器下载顺序状态信息。在大多数情况下,它可以正常工作,但有时我会得到一个Net::ReadTimeout错误。我也不知道原因?

代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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...'
...

错误信息:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/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
  • 硒版本: 3.0.1
  • 浏览器Chrome版本: 57.0.2987.110
  • Chrome驱动程序版本: 2.29.461571
  • 操作系统版本: Ubuntu 16.04.3 LTS
EN

回答 3

Stack Overflow用户

发布于 2017-11-23 03:38:54

在我们的Ubuntu构建服务器上运行Selenium测试时,我也遇到了类似的问题,但在我的Windows上,我从未在本地体验过这种情况。就像你的问题一样,这是个间歇性的问题。我花了相当长的时间去研究它,但是我没有把它归结为Ruby/ Ubuntu问题,而不是测试问题,因此我决定拯救Net::ReadTimeout错误和重试。自从实现了下面的示例,我就再也没有遇到过这个问题了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     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。它基本上捕获错误并重试/重新运行测试。

票数 5
EN

Stack Overflow用户

发布于 2017-11-23 06:45:45

首先,Watir.default_timeout与您声明的错误无关,所以即使您增加了default_timeout的时间,也不会在这里发生任何事情,Watir.default_timeout只适用于您找到一个元素时,而不是对于page_load。

第二,这个问题只存在于Ruby Selenium绑定中,而不存在于Java Selenium绑定中,例如,如果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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绑定,它正在正常工作。

好的,问题是,您将它用于goto,那么为什么不可以使用page_load来设置时间呢?

事实上,你可以缩短时间,但不能超过60秒。但是我找到了一些解决这个问题的方法,但是我强烈建议您在ruby绑定中提交一个bug。

所以这不是WATIR问题,而是Ruby selenium绑定中的问题。

票数 3
EN

Stack Overflow用户

发布于 2017-12-04 01:39:48

最后,我还用firefox测试了解决方案,并得到了描述的错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47452276

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文