14

在 Rails 应用程序中,我正在尝试使用 Capybara 和驱动程序在 Rspec 中使用jQuery TokenInput 字段测试引导模式。有问题的部分如下:capybara-webkit

click_link 'Create Team Modal'
sleep 1

within('div#modal_popup') do
  fill_in 'input#token-input-team_name', with: 'Fancy team name'
  sleep 1
  fill_in 'input#token-input-team_name', with: '\t'
  sleep 1

  click_button 'Create Team'
end

page.should have_content('Fancy team name')
  • 点击按钮获取模态
  • 用团队名称填写 TokenInput
  • 模拟 Tab 键以将其选中
  • 创建团队
  • 验证名称显示在页面上

这仅适用于所有这些sleep 1s;否则 Capybara 在 崩溃have_content,最终导致服务器错误,因为团队名称永远无法正确选择。但是,其他没有sleep 1TokenInput 字段的 Bootstrap 模式在加载之前不需要 a 。

说了这么多,有什么办法可以摆脱睡眠并让这一切正常进行吗?Capybara 2 退出wait_until(有充分的理由),因为它会在默认等待时间内等待测试某些东西……但这似乎并没有反映在我的上述测试中;就好像水豚在进入/退出这个模式时没有参与那个等待期。有人对此有经验吗?使用 Rails 3.2.10、Rspec 2.12、Capybara 2、capybara-webkit 0.14.0、TokenInput 1.6。

4

4 回答 4

9

尝试在测试环境 layouts/application.html.erb 中禁用动画

<% if Rails.env.test? %>
 <style type="text/css">
    .modal.fade, .fade {
      -webkit-transition: opacity 0.01s;
      -moz-transition: opacity 0.01s;
      -ms-transition: opacity 0.01s;
      -o-transition: opacity 0.01s;
      transition: opacity 0.01s;
    }
 </style>
<%end%>
于 2013-08-22T08:42:14.427 回答
8

我建议在测试环境中添加 falowing css:

  div, a, span, footer, header {
      -webkit-transition: none !important;
      -moz-transition: none !important;
      -ms-transition: none !important;
      -o-transition: none !important;
      transition: none !important;
  }

  .modal {
    display: none !important;
  }

  .modal.in {
    display: block !important;
  }

  .modal-backdrop {
    display: none !important;
  }

在正文中添加这个js:

$(".fade").removeClass("fade");

这解决了我使用水豚和引导程序的大部分问题。

于 2014-03-11T10:00:33.117 回答
1

我们只是这样做,它似乎工作(例如点击$('.tp-header-login'):

# instead of find(".tp-header-login")

find(".tp-header-login") # still do the find so you are sure its loaded then...
execute_script "$('.tp-header-login').click()"
于 2016-01-22T22:04:39.250 回答
1

对于那些希望避免Rails.env.___?hacks* 的人来说,以下似乎工作(到目前为止 - 手指交叉)可以避免在基于 Bootstrap 的模式上测试jQuery UI 拖放功能的问题。

首先,我们已经在“等待”模态框的出现,使用这样的辅助方法:

def wait_for_modal_to_appear
  modal = wait_until {
    # Look for the modal by ID/whatever...
  }
  raise Capybara::ModalNotFound.new('...') if modal.nil?
  return modal
end

然而,当我们尝试在该模式中拖放元素时,我们仍然遇到了一些虚假的问题。return在该行之前添加的以下代码似乎起到了作用:

page.execute_script("document.getElementById('#{modal[:id]}').classList.remove('fade');")

* 正是这样的黑客攻击最近导致需要在与我合作的公司进行紧急部署......一个糟糕的代码更改设法使其投入生产,因为它仅由if Rails.env.production?限定符激活;否则它会失败一半的测试套件。

于 2016-08-19T19:02:48.527 回答