【问题标题】:Capybara loses cookies between requestsCapybara 在请求之间丢失 cookie
【发布时间】:2016-07-02 19:26:03
【问题描述】:

我有以下测试:

  def login_user(email, password)
    visit new_user_session_path
    fill_in 'E-mail', with: email
    fill_in 'Password', with: password
    click_button 'go'
  end

  scenario 'some test' do
    order = Fabricate(:order_one, company: user.company)
    visit "http://127.0.0.1:49645/orders/#{order.id}" # change to visit "/orders/#{order.id}"
    login_user(user.email, user.password)

    #assert
  end

发生的情况是,在第一步 (visit...) 中,用户没有被登录,所以我使用 cookie 设置了一些信息。但是,当login_user被执行时,这个cookie是空的。

使用 selenium-webdriver

这里有什么想法吗?

提前致谢

【问题讨论】:

  • 设置 cookie 是特定于驱动程序的。你用的是什么capybara驱动,能贴出login_user的代码吗?
  • 也许还利用show-me-the-cookies gem 来确保您在login_user 方法中确实正确设置了cookie。
  • @BoraMa 用更多信息更新问题。
  • @BoraMa 我调试了我的控制器代码(当我设置 cookie 时),看起来还可以
  • 在我执行 login_user 的那一刻,cookie 消失了..

标签: ruby-on-rails cookies capybara


【解决方案1】:

当使用支持 JS 的驱动程序时,#visit 不能保证在返回页面时已经完成加载。由于在处理响应之前不会在浏览器中设置 cookie,因此您的 login_user 实际上是在告诉浏览器停止处理其当前访问并访问其他地方,从而阻止 cookie 在浏览器中设置。首次访问后,您需要等待页面上显示某些内容以确保 cookie 设置正确。

scenario 'some test' do
  order = Fabricate(:order_one, company: user.company)
  visit "http://127.0.0.1:49645/orders/#{order.id}"
  expect(page).to have_content('you are not logged in') #or whatever shows on the page visited
  login_user(user.email, user.password)

  #assert
end

【讨论】:

  • 好吧,在调用 login_user 之前期待一些内容,使用 show_me_the_cookies 向我展示 cookie,但是当我插入 `` puts "-> #{cookies["redirect_prev"]}"``在我的控制器中,返回空
  • 如果显示 cookie 显示在浏览器中设置了 cookie,然后在下次访问时未在控制器中设置该 cookie,则表示 cookie 设置不正确。也许您没有将其设置在正确的域上 - 您的第一次访问是 127.0.0.1 - 是第二次访问还是 'example.com' (或其他) - 这会影响域名cookie 是绑定的,如果它们不匹配,则不会发送 cookie。如果两者都匹配,您是否为 cookie 设置了一个不允许从其他路径访问它的路径?
  • 你是对的。问题是我使用的是不同的域。我只是将其更改为visit "/orders/#{order.id}",一切正常。感谢您的帮助
猜你喜欢
  • 2019-07-11
  • 2012-11-28
  • 2014-01-06
  • 2013-12-10
  • 2014-12-02
  • 2013-06-20
  • 1970-01-01
  • 2011-10-26
  • 2021-12-22
相关资源
最近更新 更多