重定向导致 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 失败的主要内容,如果未能解决你的问题,请参考以下文章