Rspec 重定向会导致Capybara webkit失败

Rspec 重定向会导致Capybara webkit失败,rspec,capybara,capybara-webkit,Rspec,Capybara,Capybara Webkit,整天都在讨论这个问题:经过大量的调查,似乎任何时候我们都有以下序列,rspec/capybara完成测试,然后挂起 顺序是: 浏览网页 执行一些操作(单击),使JS加载新页面 控制器对该页进行重定向 使用Selenium ff,一切都正常,但使用webkit,测试成功运行,然后挂起。然后必须按ctrl-c两次 我们在三台不同的机器(1台mac os,2台linuxy)上得到了相同的行为,因此问题一定是与正在加载的实际网页的交互,但请注意,页面加载良好 最新的水豚网络工具包、qt等(来自mac

整天都在讨论这个问题:经过大量的调查,似乎任何时候我们都有以下序列,rspec/capybara完成测试,然后挂起

顺序是:

  • 浏览网页
  • 执行一些操作(单击),使JS加载新页面
  • 控制器对该页进行重定向
使用Selenium ff,一切都正常,但使用webkit,测试成功运行,然后挂起。然后必须按ctrl-c两次

我们在三台不同的机器(1台mac os,2台linuxy)上得到了相同的行为,因此问题一定是与正在加载的实际网页的交互,但请注意,页面加载良好

最新的水豚网络工具包、qt等(来自mac: 水豚:2.5.0 水豚网络工具包:1.7.1 Qt:5.5.1 网络工具包:538.1 QtWebKit:5.5.1)

例如:

it 'redirects an existing logged in user to the dashboard' do
  user = FactoryGirl.create :user
  login(user, then_visit: "/")
  # the above which just does a session/new?redirect_to="/" succeeds but
  # rspec never terminates.
  # if I change it to
  #    login(user)
  #    wait(10)
  #    visit "/"
  # everything works fine.
  find(".tp-dashboard", wait: 10)      
  expect(page.current_path).to eq "/account/#{user.id}/dashboard"
end
登录方法只是执行会话/新建,然后让用户登录

为了让事情变得清楚(至少对我自己来说),我添加了这个

  after(:all) do
    puts "**************************** I know I am done, I just can't quit **********************************"
  end
果然,我得到了这个输出:

.**************************** I know I am done, I just can't quit **********************************


Finished in 18.35 seconds (files took 13.23 seconds to load)
1 example, 0 failures
我想等多久就等多久,需要两个ctrl-c才能退出

>^C
RSpec is shutting down and will print the summary report... Interrupt again to force quit.
>^C:mitch$ 
这里有两个日志:第一个是10秒的延迟,足够页面加载。第二种情况是有1秒的延迟,并且页面没有加载(因此测试失败,但rspec退出)

这就是登录方法的价值所在,但要知道,在javascript加载页面的任何场景中,都会发生同样的事情,而该页面是由控制器重定向的:

def login(user, opts = {})
  visit "/session/new#{'?return_to='+opts[:then_visit] if opts[:then_visit]}"
  fill_in "user_session[login]", with: user.login
  fill_in "user_session[password]", with: user.password
  click_button "mobile_login_submit"
end

我不得不放弃使用幻影/恶鬼。。。关于在此处设置的详细说明:


我刚刚使用了当前发布的phantomjs,并为bind添加了一个polyfill(如果出现错误并且正在使用react or,这一点很重要)

我不得不放弃使用phantomjs/poltergeist。。。关于在此处设置的详细说明:


我刚刚使用了当前发布的phantomjs,并为bind添加了一个polyfill(如果您出现错误并且正在使用react or,这一点很重要)

不确定为什么您的测试挂起,但只要您使用的是Capybara 2.5+,您就可以使用
expect(page.),以获得当前路径(“/account/{user.id}/dashboard”)
它使用水豚等待页面更改的行为,并消除了查找或睡眠汤姆的需要-是的,请意识到。。。正如围绕睡眠的评论所指出的,我们通常不会睡觉。这样做只是为了证明它似乎在等待导致问题的页面加载,而不管使用什么机制来等待。但是谢谢你的提醒!当你按下ctrl-c来显示代码的位置时,它是否会给出堆栈跟踪或任何东西?不,只是添加了完整的输出…你是否有任何其他after(:all/:suite)块,或者你是否使用了任何添加after块的gem?不确定为什么你的测试会挂起,而不是预期的挂起,只要你使用的是Capybara 2.5+,您可以使用
expect(page)。要使_当前_路径(“/account/#{user.id}/dashboard”)
使用水豚等待页面更改的行为,并消除查找或睡眠汤姆的需要-是的,请意识到。。。正如围绕睡眠的评论所指出的,我们通常不会睡觉。这样做只是为了证明它似乎在等待导致问题的页面加载,而不管使用什么机制来等待。但是谢谢你的提醒!当你按下ctrl-c来显示代码的位置时,它是否会给出堆栈跟踪或任何东西?不,只是添加了完整的输出…你是否有任何其他after(:all/:suite)块,或者你是否使用了任何添加after块的gem?