Turbolinks 5 / Capybara / Rails

5
我正在升级我的Rails应用程序,使用Turbolinks 5以利用Native Wrappers。我已更新了所有javascript,并且在浏览器和Android应用程序中一切正常。但是,在使用js true时,我的一些capybara测试出现问题。在撰写本文时,我使用的是最新的capybara(2.11.0)、poltergeist(1.12.0)和phantomjs(2.1)。我也尝试过capybara-webkit驱动程序,但没有成功。
出现问题的地方似乎是在turbolinks 5中,所有表单都应该通过远程方式提交,并且turbolinks知道如何处理请求。我发现,使用Capybara时,我的表单在提交后并没有重定向,而是停留在同一页上。我进行了大量的谷歌搜索和试错,但一无所获。如果需要更多信息,请让我知道。
  scenario 'user has dispatch permission and valid attributes', js: true do
    sign_in('jdoe')
    page.visit path
    page.fill_in 'contact_text_input', with: 'Jimmy'
    page.select 'Medium - 3 Hours', from: 'Priority'
    page.fill_in 'Created By', with: 'John Doe'
    page.click_button 'Create This'
    save_and_open_page
    expect(page.current_path).to eq("/dispatch")
    expect(page).to have_content('This was created successfully')
  end

  def sign_in(username)
    page.visit '/'
    page.fill_in 'Username', with: username
    page.fill_in 'Password', with: 'test'
    page.click_button 'Log In'
  end

你是否正在使用 js_errors: true 运行 Poltergeist,以确保没有任何 JS 错误或使用不支持的 JS 函数/特性(Poltergeist 2.1.1 不支持 ES2015 - 新的 2.5 beta 应该支持)。此外,请注意,在你的 JS 中使用 let 将在 Poltergeist 2.1.1 中静默失败。 - Thomas Walpole
此外 - 我预计您的测试会因为 sign_in 没有等待登录完成而失败。这意味着您测试中的 page.visit path 可能在身份验证 cookie 被设置之前被调用,因此无法加载您认为的页面。您应该添加一些内容来确保登录已完成,例如 expect(page).to have_text('You have logged in!') 或者显示成功登录的页面上的任何内容。 - Thomas Walpole
谢谢您提供的所有指引,我遇到了登录问题,所以我会尝试解决它。我正在尝试安装PhantomJS的beta版,但登录问题可能是我遇到的问题。 - Ryan Condron
抱歉 - 我的意思是 PhantomJS 2.1.1 - 而不是 poltergeist - 还有 PhantomJS 2.5 beta。但现在它仍然是一个测试版,有一些问题需要解决。 - Thomas Walpole
我回到2.1.1版本,并且使用我的sign_in函数的建议解决了大部分测试失败问题。我还有一些问题,主要是由于仍在实现turbolinks。感谢您的帮助。 - Ryan Condron
如果你删除了 save_and_open_page 这行代码,会发生什么事情,@RyanCondron? - Zalom
3个回答

4

您可以通过进度条跟踪Turbolinks AJAX请求,例如:

def wait_for_turbolinks
  has_css?('.turbolinks-progress-bar', visible: true)
  has_no_css?('.turbolinks-progress-bar')
end

3
不错的解决方案ErgoLau。我做了一些小改动来修复最长等待时间。
def wait_for_turbolinks timeout = nil
  if has_css?('.turbolinks-progress-bar', visible: true, wait: (0.25).seconds)
    has_no_css?('.turbolinks-progress-bar', wait: timeout.presence || 5.seconds)
  end
end

2
我遇到了这个问题。我的解决方法是(就像Thomas Walpole在评论中建议的那样)在提交登录表单后添加一个expect(page).to have_text(“应该在登录后重定向到的页面中的某些文本”)
在我们的情况下,我们有一个log_in_buyer_using_the_form测试帮助程序,所以我修改了它以接受一个参数:log_in_buyer_using_the_form(wait_for_content: item.title) 我在这里的假设是我们需要等待表单的Ajax提交完成,然后等待Turbolinks根据Ajax响应进行重定向。通过让测试等待一些内容出现,我们知道它已经过了那个阶段。
理论上更优雅的解决方案是设置一个事件监听器,使用page.execute_script循环直到某个事件(如turbolinks:load)运行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接