自动完成方法拒绝在RSpec测试中触发

AKW*_*KWF 5 rspec capybara ruby-on-rails-3 poltergeist

我正在第4天尝试autocomplete在RSpec测试中开火.在浏览器中超级工作,它非常难以在我的请求规范中运行.


更新:看起来我的RSpec/Capy脚本是针对dev db而不是test db运行的.我使用的是战俘,所以我不知道如何设置default_url_options[:host]Capybara.app_hostCapybara.server_port到.我有一种感觉,如果我解决这个问题,它可能有用.


堆栈是:

  • Rails 3.2.16
  • 水豚
  • RSpec的
  • 鬼驱人/ PhantomJS
  • 战俘
  • 宙斯
  • 工厂女工

点击链接,点击按钮,fill_in字段都很棒.但是,当需要让这个自动完成工作时,它绝对拒绝工作.

我正在使用这种方法:

def fill_autocomplete(field, options = {})
  fill_in field, with: options[:with]
  page.execute_script %Q{ $("##{field}").trigger('focus') }
  page.execute_script %Q{ $("##{field}").trigger('keydown') }
  selector = %Q{ul.ui-autocomplete li.ui-menu-item a:contains("#{options[:select]}")}
  Capybara::Screenshot.screenshot_and_open_image
  page.should have_selector('ul.ui-autocomplete li.ui-menu-item a')
  page.execute_script %Q{ $("#{selector}").trigger('mouseenter').click() }
end
Run Code Online (Sandbox Code Playgroud)

我在这里找到.这screenshot条线是我自己的.但是上面的一行:

  page.should have_selector('ul.ui-autocomplete li.ui-menu-item a')
Run Code Online (Sandbox Code Playgroud)

回报false.它就像浏览器中的魅力一样.我不能为我的生活弄清楚为什么它不起作用.我已经尝试过我所知道的一切.我该怎么调试呢?

屏幕截图只显示了我期待的页面,并且字段填写正确.我甚至用插入autocomplete呼叫的"你好"警报对此进行了测试.在浏览器中完美运行,但在测试中根本没有结果.

简而言之,看起来以下两行没有效果:

  page.execute_script %Q{ $("##{field}").trigger('focus') }
  page.execute_script %Q{ $("##{field}").trigger('keydown') }
Run Code Online (Sandbox Code Playgroud)

小智 3

我遇到了类似的问题,尽管 Capybara 的文档说have_selector将等待 AJAX 调用完成,但它对我不起作用。

以下内容在我的案例中有效:

def fill_in_autocomplete(field_label, field_class, options = {})
  field_id = "##{page.evaluate_script("$('#{field_class}').attr('id')")}"

  selector = "ul.ui-autocomplete li.ui-menu-item a"

  fill_in(field_label, with: options[:with])
  page.execute_script("$('#{field_id}').trigger('focus')")
  page.execute_script("$('#{field_id}').trigger('keydown')")

  sleep(2) # Hack! not sure why the line below isn't working...
  #expect(page).to have_selector(selector, text: options[:with])

  page.execute_script("$('#{selector}').click()")
end
Run Code Online (Sandbox Code Playgroud)

您可以像这样调用上面的方法:

fill_in_autocomplete('Some label', '.js-some-field', with: 'Some value'
Run Code Online (Sandbox Code Playgroud)

我不想传递字段 ID 并选择了一个类,这就是为什么助手中的第一行根据元素的类获取 ID。