重定向导致Capybara-webkit失败

时间:2016-01-11 20:30:57

标签: rspec capybara capybara-webkit

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

序列是:

  • 访问页面
  • 执行一些导致JS加载新页面的操作(单击)
  • 控制器执行该页面的重定向

Selenium ff的一切正常,但是使用webkit测试成功运行,然后它就会挂起。然后你必须按两次ctrl-c。

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

最新的capybara-webkit,qt等(来自mac: 水豚:2.5.0 capybara-webkit:1.7.1 Qt:5.5.1 WebKit: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

login方法只执行session / new,然后将用户登录。

为了弄清楚(至少对我自己而言)我添加了这个

  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退出)

https://gist.github.com/catmando/81dafb5212e8163389bd

https://gist.github.com/catmando/264accacf25e98bcb179

这值得的是登录方法,但是理解我们在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

1 个答案:

答案 0 :(得分:0)

我不得不放弃并使用phantomjs / poltergeist ......这里有很好的设置说明:

我刚刚使用了当前发布的phantomjs并添加了一个polyfill for bind(如果你遇到错误并且你正在使用react或react.rb,则很重要)