重定向导致 Capybara-webkit 失败

Posted

技术标签:

【中文标题】重定向导致 Capybara-webkit 失败【英文标题】:redirects cause Capybara-webkit to fail 【发布时间】:2016-04-16 07:00:45 【问题描述】:

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

顺序是:

访问页面 执行一些操作(点击)导致 JS 加载一个新页面 控制器对该页面进行重定向

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

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

最新的capybara-webkit、qt等(来自mac: 水豚:2.5.0 水豚webkit:1.7.1 数量: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退出)

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

【问题讨论】:

不确定为什么您的测试会挂起,但不是您所期望的,只要您使用 Capybara 2.5+,您就可以使用 expect(page).to have_current_path("/account/#user.id/dashboard"),它使用 Capybaras 等待页面更改的行为并消除了查找或睡眠的需要 Tom - 是的,意识到...正如围绕睡眠笔记的评论,我们通常不会睡觉。这样做只是为了证明它似乎正在等待导致问题的页面加载,无论使用什么机制等待。不过谢谢提醒! 当你按下 ctrl-c 来显示代码在哪里时,它会给出堆栈跟踪或任何东西吗? 不 - 刚刚添加了完整的输出...... 你有没有其他的 after(:all/:suite) 块或者你正在使用任何在块之后添加的 gem? 【参考方案1】:

我不得不放弃并使用 phantomjs / poltergeist...在这里设置的优秀说明:

https://mediocre.com/forum/topics/phantomjs-2-and-travis-ci-we-beat-our-heads-against-a-wall-so-you-dont-have-to http://www.railsonmaui.com/blog/2013/08/06/migrating-from-capybara-webkit-to-poltergeist-phantomjs/ http://www.railsonmaui.com/tips/rails/capybara-phantomjs-poltergeist-rspec-rails-tips.html

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

【讨论】:

以上是关于重定向导致 Capybara-webkit 失败的主要内容,如果未能解决你的问题,请参考以下文章

PHP检测url是不是重定向并重试重定向

微信授权,重定向两次

为啥这个 301 重定向会导致重定向到错误的 url?

Laravel 重定向返回导致重定向循环

重定向到子域会导致重定向循环错误

CORS 请求重定向失败