从Ruby中的Capybara运行时,webkit_server会定期挂起

时间:2012-03-04 21:01:13

标签: ruby webkit capybara qtwebkit capybara-webkit

我遇到一个问题,即访问URL时,带有Capybara和capybara-webkit的webkit_server实例无法连接到本地Xvfb屏幕。这似乎发生在反复访问不同的URL和执行查找程序几分钟后。 (我使用capybara在vanilla Ruby中进行屏幕抓取应用,而不是用于测试。)

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

当我浏览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)

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

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

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

有关我可以采取哪些措施进行故障排除或纠正此问题的任何想法都表示赞赏。我假设问题与某些资源webkit_server需要访问URL有关,但我不确定接下来要尝试什么。

谢谢!

3 个答案:

答案 0 :(得分:14)

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

简单地添加'瘦'是不够的。 但明确使用Thin处理程序。添加到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

答案 1 :(得分:3)

我发现错误后调用Capybara.reset_sessions!似乎可以解决这个问题。我不知道为什么,但我从未遇到过这个问题。

答案 2 :(得分:2)

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