11

我遇到一个问题,当访问 URL 时,带有 Capybara 和 capybara-webkit 的 webkit_server 实例运行无头连接到本地 Xvfb 屏幕时挂起。它似乎是在反复访问不同的 URL 并执行查找程序几分钟后发生的。(我将 capybara 用于香草 Ruby 中的屏幕抓取应用程序,而不是用于测试。)

我已经确认,当它挂起时,仍然可以访问该站点(例如,通过命令行上的 curl 或 wget)。我还尝试将调用访问和后续查找器的 Ruby 代码包装在 Timeout 块中,以便在等待 60 秒后访问新 URL,但在第一次发生这种情况后,任何 visit() 尝试都会失败。解决此问题的唯一方法是杀死调用 Capybara/capybara-webkit 的 Ruby 进程和 webkit_server 进程并重新启动。

当我跟踪 webkit_server 进程时,我反复看到这样的输出:

clock_gettime(CLOCK_MONOTONIC, {5821, 680279627}) = 0
gettimeofday({1330890176, 712033}, {0, 33052112}) = 0
gettimeofday({1330890176, 712087}, {0, 140736435864256}) = 0
gettimeofday({1330890176, 712137}, {0, 33108640}) = 0
clock_gettime(CLOCK_MONOTONIC, {5821, 680486036}) = 0
clock_gettime(CLOCK_MONOTONIC, {5821, 680530091}) = 0
read(7, 0x1fac1b4, 4096)                = -1 EAGAIN (Resource temporarily unavailable)

如果我 strace 调用它的 Ruby 进程,它会挂在 read() 上:

Process 3331 attached - interrupt to quit
read(5, 
^C <unfinished ...>
Process 3331 detached

我知道 Ruby 代码挂在 Capybara visit() 方法上。

任何关于我可以做些什么来解决或纠正这个问题的想法都值得赞赏。我假设问题与 webkit_server 需要访问 URL 的某些资源有关,但不确定接下来要尝试什么。

谢谢!

4

3 回答 3

15

capybara-webkit 1.0 也随机挂在我的整个套件上。

简单地添加“瘦”是不够的。但是显式使用瘦处理程序有效。添加到 env.rb:

Capybara.server do |app, port|
  require 'rack/handler/thin'
  Rack::Handler::Thin.run(app, :Port => port)
end

注意瘦使用警告:https ://github.com/thoughtbot/capybara-webkit/issues/399#issuecomment-22328028

于 2013-08-07T23:27:12.363 回答
3

我发现Capybara.reset_sessions!在错误后调用似乎可以纠正这个问题。我不知道为什么,但从那以后我就没有遇到过问题。

于 2012-04-14T21:21:00.073 回答
2

当 Capybara 使用 Webrick 运行服务器时,我已经看到了这个问题。将“gem 'thin'”添加到您的 Gemfile 中,它将自动使用它。看看有没有帮助?

于 2012-04-06T09:42:08.727 回答