【问题标题】:Why is Capybara not matching new DOM elements inserted after an AJAX call?为什么 Capybara 不匹配 AJAX 调用后插入的新 DOM 元素?
【发布时间】:2016-07-16 21:29:45
【问题描述】:

我正在使用 Rails 5 和 Capybara。我创建了一个简单的 Rails 视图搜索表单。提交后,vanilla JS 使用 preventDefault 接管并执行 AJAX 以获取搜索结果。然后将结果打包到一个表中,并附加到 DOM。该页面在开发中运行良好,但是,capybara 不配合我的功能规范:

expected to find css "#search_results table" but there were no matches.

作为健全性检查,我匹配了我认为已经存在的 css,因此 Capybara 可以正确地进行一些匹配,而不是 JS 引入的元素。

我在 Capybara 匹配器中设置了一些标准的 Ruby sleep xwait: x。还看到了一些文章,其中包含强制 Capybara 等待的自定义方法示例,但那些需要我没有使用的 jquery。我希望 capybara 能够处理这个 vanilla JS,但是没有运气让它在这里工作。请帮忙。

查看:

<div id='media_search'>
  <%= form_for(:search, method: "get", html: {class: "navbar-form navbar-left form-inline"}) do |f| %>
   <%= f.label :search %>
   <%= f.text_field :search, id: "media_search_field", class: "form-control", placeholder: "song, album, or artist" %>
   <%= f.submit "Submit", id: "media_search_submit", class: "btn btn-default" %>
  <% end %>

  <div id='search_results'></div>
</div>    

原版 JS 片段:

var ajaxSearchMedia = function (query, successCb) {
  var request = new XMLHttpRequest();
  request.open('GET', '/search?query=' + query, true);

  request.onload = function() {
    if (request.status >= 200 && request.status < 400) {
      // Success!
      var songs = JSON.parse(request.responseText);
      successCb(songs);
    } else { ...

功能测试:

scenario "with results" do
  visit '/'

  fill_in "media_search_field", with: "song"

  click_on "media_search_submit"

  expect(page).to have_css("#search_results table")
end

【问题讨论】:

  • 你用的是什么驱动?

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


【解决方案1】:

您的场景语句未使用js: true 标记,如果使用正常的水豚配置,则意味着您使用的是不支持 JS 的默认机架测试驱动程序。您将需要配置依赖于 JS 行为的测试以使用支持 JS 的驱动程序 - 请参阅https://github.com/jnicklas/capybara#selecting-the-driver。您还需要配置相同的测试以不使用事务测试 - 请参阅 https://github.com/jnicklas/capybara#transactions-and-database-setuphttps://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example

【讨论】:

  • 实际上,对于 Rails 5 事务功能测试应该是可能的。如果一切都失败了,请使用 Test Prof 的 Active Record Shared Connection backport。
  • @Epigene 这个答案来自 2016 年,当时是正确的 - 是的,对于 Rails 5.1+ 事务测试应该可以与 JS 测试一起正常工作,并且不再需要 database_cleaner。在相关的说明中,虽然您链接到的 Rails 5.0 的共享连接黑客在大部分时间都可以工作,但随着您的应用程序变得更加复杂,它最终会导致非常难以调试的随机死锁 - 没有 100%使用 Rails 进行多线程事务测试的安全方法
猜你喜欢
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
  • 2012-05-18
  • 2019-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多