【问题标题】:Turbolinks 5 / Capybara / RailsTurbolinks 5 / Capybara / Rails
【发布时间】:2017-01-16 19:25:06
【问题描述】:

我正在升级我的 Rails 应用程序以使用 Turbolinks 5 来利用 Native Wrappers。我已经更新了所有的 javascript,并且在浏览器和 Android 应用程序中一切都按预期工作。使用 js true 时,我的一些水豚测试遇到了麻烦。在撰写本文时,我正在使用最新的 capybara (2.11.0)、poltergeist (1.12.0) 和 phantomjs (2.1)。我也尝试过 capybara-webkit 驱动程序,但没有成功。

我似乎遇到的问题是,在 turbolinks 5 中,所有表单都应远程提交,并且 turbolinks 知道如何处理请求。我发现使用 Capbara 我的表单在提交后不会重定向,它保持在同一页面上。我做了很多谷歌搜索和反复试验,但有一些不足。任何帮助将不胜感激。如果需要更多信息,请告诉我。

  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 中静默失败
  • 另外 - 由于sign_in 没有等待登录完成,我预计您的测试会失败。这意味着您的测试中的page.visit path 可能会在设置身份验证cookie 之前被调用,因此不会加载您认为的页面。您应该有一些东西来确保登录已经完成,例如expect(page).to have_text('You have logged in!') 或页面上显示的任何内容以表明成功登录。
  • 谢谢你的所有指点,登录问题是我遇到的问题,所以我一定会尝试的。我正在尝试安装 phantomjs 的测试版,但登录问题可能是我遇到的问题
  • 抱歉——我的意思是 PhantomJS 2.1.1——不是 poltergeist——和 PhantomJS 2.5 beta。不过,它现在非常处于测试阶段,并且有一些自己的问题
  • 我回到 2.1.1 并且我的 sign_in 函数的建议解决了我的大部分测试失败。我还剩下一些,主要是因为仍在实施 turbolinks。谢谢大家的帮助。

标签: javascript ruby-on-rails ruby-on-rails-4 capybara turbolinks


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    很好的解决方案 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
    

    【讨论】:

      【解决方案3】:

      我遇到了这个问题。我的解决方法是(就像 Thomas Walpole 在评论中建议的那样)在提交登录表单后添加 expect(page).to have_text("Some text from the page you should be redirected to after login")

      在我们的例子中,我们有一个 log_in_buyer_using_the_form 测试助手,所以我对其进行了修改以接受一个参数:log_in_buyer_using_the_form(wait_for_content: item.title)

      我的假设是,我们需要 1. 等待表单的 Ajax 提交发生,2. 然后等待 Turbolinks 根据 Ajax 响应重定向。通过让测试等待某些内容出现,我们知道它已经过了那个阶段。

      我没有尝试过的更优雅的方法,但理论上应该可行,那就是使用page.execute_script 设置一个事件侦听器,该侦听器循环直到像turbolinks:load 这样的事件运行为止。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 1970-01-01
        • 2017-12-14
        • 2021-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多