【问题标题】:Tests UJS Rails with Capybara, Selenium and Rspec使用 Capybara、Selenium 和 Rspec 测试 UJS Rails
【发布时间】:2017-05-15 14:59:39
【问题描述】:

在我的页面上有:

-->使用 ujs 发出的 Ajax 请求抓取另一个网站内容的表单(remote: true):

<%= simple_form_for @listing, :url => listings_fetch_url, remote: true do |f| %>
  <%= f.input :url %>
  <%= f.button :submit, id: 'import_button' %>
<% end %>

-->另一个由上面表单的抓取结果填充的表单

手动操作...

但是,当我尝试自动测试它时,它没有。 Capybara 找到了提交按钮,点击了它,但它让我留在了一个空白页面上。

这是测试的代码:

feature "Listing import" do
  scenario "fills in the form fields", js: true do
    visit new_search_path
    fill_in 'Url', :with => 'www.google.fr'

    find('input#import_button').click

    expect(page.body).to have_content 'query was'
  end
end

控制器操作如下:

def fetch
    url = listing_params[:url] 
    @query = Query.new(ScraperService.new({url: url}).perform)
    render :fill
end

# Renders an js.erb file
def fill
end

似乎带有 selenium 的 rspec 无法渲染 js.erb 文件?

感谢任何帮助!

编辑

感谢@ThomasWalpole,我修复了阻止 Mechanize 抓取网络的错误 500。内容现在已正确抓取,但问题仍然存在:单击提交按钮后的页面变为空白,测试随即结束。 在日志中我有一条很长的消息:

无法记录“render_template.action_view”事件。无方法错误: 未定义的方法example_group' for nil:NilClass ["/Users/Greg/.rbenv/versions/2.4.0/lib/ruby/gems/2.4.0/gems/rspec-rails-3.6.0/lib/rspec/rails/view_rendering.rb:67:in current_example_group'"

这似乎与以下问题相同:1 & 2

【问题讨论】:

  • Capybara with Selenium 绝对可以渲染 js.erb 文件。查看您的 test.log 文件并查看正在发出的请求、请求的格式以及响应代码是什么。 Query.new(ScraperService.new({url: url}).perform 中的任何一个是否向应用程序发出另一个请求,在单独的线程中运行等?如果是这样,您是否使用 :puma 作为您的 Capybara 服务器 (Capybara.server = :puma)?
  • 感谢@ThomasWalpole 的提示!日志显示由require 'webmock/rspec' 引起的 500 服务器错误,这阻止了 Mechanize 访问网络。 Query.new... 没有向应用程序发出另一个请求,也没有在单独的线程中运行。可悲的是,使用 Puma 并没有改变任何东西。请查看我更新的问题。
  • 尝试降级到 rspec 3.5.x 。 -- 可能是 3.6 中的一个错误
  • 降级到 rspec 3.5.x 消除了日志中冗长的错误!

标签: ruby-on-rails selenium rspec capybara ujs


【解决方案1】:

解决了!

问题在于我的 js.erb 没有在当前页面上添加新元素(即:新类、新 id、新 DOM 元素...... )。

Capybara 从未等待 Ajax 请求完成!

我在我的 js.erb 中添加了一个新行:

$("#import_button").addClass("imported");

这样我就知道当导入的类出现在当前页面时,就意味着Ajax请求结束了。

然后在我的测试中我添加了以下行:

expect(page).to have_selector :css, '#import_button.imported', wait: 10

现在一切正常?

P.S.:this website 也帮助我理解了问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多