Ruby on rails 水豚和地精试验失败

Ruby on rails 水豚和地精试验失败,ruby-on-rails,phantomjs,capybara,poltergeist,Ruby On Rails,Phantomjs,Capybara,Poltergeist,我一直在为capyabara使用:firefox驱动程序,该测试通过了,但当我切换到poltergeist驱动程序时,测试失败,出现以下错误: Minitest::意外错误:Capybara::ElementNotFound:找不到字段“email” 这是水豚和恶灵的设置: def setup # FactoryGirl.lint DatabaseCleaner.strategy = :truncation DatabaseCleaner.start Capy

我一直在为capyabara使用:firefox驱动程序,该测试通过了,但当我切换到poltergeist驱动程序时,测试失败,出现以下错误:

Minitest::意外错误:Capybara::ElementNotFound:找不到字段“email”

这是水豚和恶灵的设置:

  def setup
    # FactoryGirl.lint
    DatabaseCleaner.strategy = :truncation
    DatabaseCleaner.start
    Capybara.run_server = true
    Capybara.register_driver :poltergeist do |app|
      Capybara::Poltergeist::Driver.new(app, :js_errors => false)
    end

    Capybara.default_driver = :poltergeist
    Capybara.current_driver = :poltergeist
    Capybara.javascript_driver = :poltergeist
    Capybara.app_host = 'http://localhost:4200'
    Capybara.server_port = 3000
    Capybara.default_max_wait_time = 5
  end
以下是测试:

test "User should be able to signin" do
    visit '/'
    wait_for_ajax
    fill_in 'email', with: @user.email
    fill_in 'password', with: @user.password
    assert true
  end
因此,当我将驱动程序更改为:selenium时,测试通过,没有错误

如何设置/修复poltergeist以通过此测试

我拍摄了屏幕截图,它显示了加载指示器,该指示器是一个div,使用以下代码在afterModel Ember hook中移除:

_ember['default'].$('.ember-load-indicator').remove();
对于Ajax调用,我们使用以下函数作为测试助手来等待Ajax调用:

  def wait_for_ajax
    Timeout.timeout(Capybara.default_wait_time) do
      loop until finished_all_ajax_requests?
    end
  end

  def finished_all_ajax_requests?
    page.evaluate_script('jQuery.active').zero?
  end

我怀疑这是个时间问题。。。当使用poltergeist vs浏览器时,您可以获得这些奇怪的行为,其中存在元素,但未真正加载,因此出现错误。。。确认这一点的一个简单方法是在填写电子邮件之前先睡一觉。。。把
sleep 10
放在安全的地方

附加提示:

<>帮助调试无头测试,考虑在失败中添加屏幕截图-< /P> 将此添加到水豚设置的末尾:

Capybara::Screenshot.register_filename_prefix_formatter(:rspec) do |example|
  "screenshot_#{example.description.gsub(' ', '-').gsub(/^.*\/spec\//,'')}"
end

screenshot_path = "#{PROJECT_ROOT}/screenshot/"
Capybara.save_and_open_page_path = screenshot_path

文件名前缀格式化程序不适用于my test.hmmm,不完全重要,因此您可以删除格式化程序。。。关键是保存一个屏幕截图,这样你就可以看到无头苍蝇看到了什么。。。只需使用最后2行代码…屏幕截图仅显示加载指示器或其他页面导航栏,但没有表单字段。它在poltergeist中加载部分页面,但在selenium中工作良好。我认为问题出在phantomjs上,因为我试图在phantomjs中加载同一个页面,但我得到了
TypeError:“undefined”不是一个函数(计算'this.window.console.error.bind(this.window.console)')
Capybara/phantomjs如果有JS错误,测试将显式失败,与selenium不同。。。一个粗略的猜测是,在页面加载时,会抛出js错误,此时测试会停止,从而中断页面加载。。。如果我自己没有能力复制,就很难给你更多的建议。。。