在JS完成之前,Capybara进行了火灾测试

时间:2016-07-05 15:06:30

标签: javascript jquery ruby-on-rails rspec capybara

我有一个水豚测试,检查是否在页面上找到了一个类。该类允许用户查看侧边栏。这是下面的测试。

feature 'Lesson Sidebar', js: true do
  before do
    visit course_lesson_path
  end
  context 'persists the lesson sidebar display' do
    before do
      find('#lesson-sidebar__lesson-2').trigger('click')
    end

    scenario do
      expect(page).to have_selector('.lesson-page__sidebar--expanded', visible: false)
    end
  end
end

当单击#lesson-sidebar__lesson-2时,JS代码会简单地将类添加到侧边栏元素。代码在文档就绪调用中。

$(document).ready(function() {
  $('.lesson-subnav__heading').on("mousedown", "#lesson-sidebar__lesson-2", function (e) {
    $('#sidebar').addClass('lesson-page__sidebar--expanded')
  })
})

以下是我收到的错误回复。

Capybara::ElementNotFound:
  Unable to find css "#lesson-sidebar__lesson-2"

这是我的问题。测试将随机失败。不仅适用于此测试,还适用于此页面中的其他测试。我的假设是测试在JS有机会完成之前运行,这就是测试有时失败的原因。我如何解决这个问题,以便每次测试通过?

1 个答案:

答案 0 :(得分:0)

更新:实际错误的发布显示,它是找不到元素的before块中的find,这意味着这与wait_for_ajax调用或事件处理程序没有任何关系捆绑。如果执行find('#lesson-sidebar__lesson-2', wait: 20).click之类的操作不会使错误消失,那么您的页面加载存在问题(或者您错误地选择了选择器),尽管我不希望这会导致间歇性故障。检查测试日志以了解实际发出的请求和/或添加

sleep 10
page.save_screenshot

在查找/点击之前查看页面以查看它是否符合您的预期。要检查的另一件事是你在驱动程序配置中显示你的JS错误(我假设你使用了poltergeist,因为大多数人默认使用.trigger)