我们正在尝试将我们的Ruby版本从2.2.7升级到2.4.3。该应用程序本身运行良好,但我们通过Capybara和无头Chrome(使用Chromedriver)运行的所有功能测试都突然失败。
以下是我们所看到的确切错误的一个示例:
Failures:
1) New UI - Settings Page - API with an unpermitted tier clicking on the "Request API Key" button shows a feature popup
Got 0 failures and 2 other errors:
1.1) Failure/Error: Unable to find matching line from backtrace
EOFError:
end of file reached
1.2) Failure/Error: Unable to find matching line from backtrace
EOFError:
end of file reached
以下是我们如何为无头Chrome配置Selenium驱动程序:
CHROME_BINARY = ENV.fetch('CHROME_BINARY', '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome')
Capybara.register_driver :headless_chrome do |app|
Capybara::Selenium::Driver.new(
app,
browser: :chrome,
desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome(
'chromeOptions' => {
'binary' => CHROME_BINARY,
'args' => %w(no-sandbox disable-gpu window-size=1440,900 headless)
}
)
)
end
Ruby版本:2.4.3
Chromedriver版本:2.35.528157
Capybara版本:2.18.0
RSpec版本:3.7.0
selenium-webdriver:3.9.0
Chrome:64.0.3282.167
我所做的所有其他研究表明,将Chromedriver更新到最新版本将解决此问题,但我们已经在使用最新版本(2.3.5)。
我还没有找到办法为上述错误获得更多的回溯。规范甚至没有达到从数据库加载任何东西的程度,它只会立即失败。
需要注意的另一件事是:在我们的CI服务器和本地开发机器上都发生了同样的确切行为。我们将CircleCI与Dockerized Linux容器一起使用,将MacOS Sierra / High Sierra用于我们的开发机器。
我们没有使用chromedriver-helper或任何其他自动安装chromedriver的gem。 chromedriver的安装是通过brew install chromedriver
或从chromedriver网站下载最新的chromedriver并放入我们的$PATH
。
答案 0 :(得分:6)
更新:此问题的根源是WEBrick的monkeypatch。它命名不佳,位于一个不寻常的位置,作者不再在团队中。一个很好的提醒是,应该不惜一切代价避免使用monkeypatches。
原始答案:
我一直在与乔丹(OP)就此问题进行合作。虽然我们没有找到根本原因,但我们发现没有回溯的EOFError来自哪里。
以下代码可以在Ruby的标准库中找到:Net::BufferedIO#rbuf_fill
https://github.com/ruby/ruby/blob/v2_4_3/lib/net/protocol.rb#L185
# callers do not care about backtrace, so avoid allocating for it
raise EOFError, 'end of file reached', []
我的猜测是这段代码的作者希望在某些时候能够挽救这个错误。也许有一个错误允许错误到达我们,没有回溯。
正如我所说,我们从未找到根本原因。然而,我们确实将其缩小到我们能够找到可接受的工作的程度。该问题似乎与Webrick有关,如果没有另外指定,它是默认使用的服务器
get
请求(127.0.0.1):https://github.com/teamcapybara/capybara/blob/2.18_stable/lib/capybara/server.rb#L82 我认为Webrick反应异常,或根本没有回应。如果有人对此事有进一步的了解,我很乐意学习。
在我们的案例中,解决方法很简单。该应用程序已经在其他环境中使用puma,所以我们决定尝试使用puy与capybara,看看它是否能解决这个问题:
Capybara.server = :puma
由于不再使用Capybara的机架式服务器,我们不再受影响。
如果其他人遇到同样的问题或有关于根本原因的想法,请分享!
编辑1:
在逐步执行代码时,当我到达caller
时,我抓住rbuf_fill
的结果。对于那些感兴趣的人,我已将其上传到https://gist.github.com/benjaminwood/c7c0d39fcfb2efd8a9085874cac07c36
编辑2:
更新了有关Webrick作为Capybara默认服务器的信息。感谢@Thomas Walpole澄清这一点。
编辑3:
添加关于分辨率的说明(这是一个monkeypatch)。