Capybara::Poltergeist::MouseEventFailed。 Poltergeist 检测到另一个元素

Capybara::Poltergeist::MouseEventFailed. Poltergeist detected another element

我正在使用水豚测试我的按钮点击功能。

require 'spec_helper'

describe 'journals edition', js: true do

let(:update_button) { find('[name="commit"][value="Update"]') }

 describe 'redirection after update' do

 describe 'articles' do

  before :each do
    @journal = Journal.create(jid: '1')
  end

  it 'should redirect to detail' do
    visit dashboard_journal_path @journal
    update_button.trigger(:click)
    current_path.should eq dashboard_journals_path
  end

end
end
end

当我从视图中删除名称为 class 'rights_link' 的 div 时,我没有收到错误

 Failure/Error: update_button.click
 Capybara::Poltergeist::MouseEventFailed:
   Firing a click at co-ordinates [45, 751] failed. Poltergeist detected another element with CSS selector 'html body footer div#footer div#login_info a' at this position. It may be overlapping the element you are trying to interact with. If you don't care about overlapping elements, try using node.trigger('click').
 # ./spec/features/journals/journal_edition_spec.rb:17:in `block (4 levels) in <top (required)>'

这是我的视图文件

  h2 Journal #{@journal.id}

= errors_for @journal

div.show
  = form_for [:dashboard, @journal] do |f|
    div
  strong ID:
  br
  = @journal.id
div
  strong JID:
  br
  = @journal.jid
div
  strong Abbreviation:
  br
  = f.text_field :abbreviation, size: '25%'
div
  strong Name:
  br
  = f.text_field :name, size: '25%'
div
  strong Free Access:
  br
  = f.check_box :free_access
div
  strong Static Cover Image:
  br
  = f.check_box :static_cover_images, class: 'static_cover_image_enable'
div class='static_cover_image'
  - if @journal.cover_image.exists?
    = image_tag @journal.cover_image.url(:thumbnail)
    br
    italic Replace static cover image:
    br
    = f.file_field :cover_image, as: :file

  - else
    = f.file_field :cover_image, as: :file
**div class='rights_link'
  strong Rights Link
  br
  = f.check_box :rights_link_enabled, class: 'rights_link_enable'**
div class='rights_link_type'
  strong Rights Link Type:
  br
  - if @journal.rights_link_type == 'permission_direct'
    = radio_button_tag :rights_link_type, 'rights_link'
    | Rights Link
    = radio_button_tag :rights_link_type, 'permission_direct', true
    | Permission Direct
  - else
    = radio_button_tag :rights_link_type, 'rights_link', true
    | Rights Link
    = radio_button_tag :rights_link_type, 'permission_direct'
    | Permission Direct
div class='rights_link_template'
  strong Rights Link URL Template:
  br
  = f.text_area :rights_link_template, class: 'rights_link_template', size: '50%'
div class='issn'
  strong ISSN
  br
  = f.text_field :issn, size: '25%'
div class='rights_holder_name'
  strong Rights Holder Name
  br
  = f.text_field :rights_holder_name, size: '25%'
div
  strong Exclude From All Articles:
  br
  = f.check_box :exclude_from_all_articles
div
  strong Enabled:
  br
  = check_box_tag 'journal[enabled]', 1, @journal.disabled_at ? false : true
div
  strong Updated At:
  br
  = display_local_time @journal.updated_at
div
  strong Min iOS Version:
  br
  = f.text_field :ios_min_version, size: '25%'
div
  strong Min Android Version:
  br
  = f.text_field :android_min_version, size: '25%'
= f.submit "Update"

= link_to 'Back', dashboard_journals_path

请提供解决方案。

我尝试使用

update_button.trigger(:click)

但没有帮助。请注意:'rights_link' div 之前的 div 在某些情况下被隐藏和显示。

首先,如果您正在测试应用程序,请不要使用 #trigger。建议使用 #trigger 的错误消息的重要部分是 "If you don't care about overlapping elements"。在测试应用程序时,您应该小心,否则您将允许测试执行用户无法执行的操作(如果是屏幕抓取或自动化流程,那就另当别论了)。

该错误解释了问题所在,您有相互重叠的元素,并且通常可以通过在您的 poltergeist 驱动程序配置中指定更大的 window 大小来修复。您通常可以通过在单击步骤之前调用 save_and_open_screenshot 并查看屏幕截图来了解重叠的原因。如果页面太窄或太短,您可以在必要的方向上增加 window 大小。

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, window_size: [1600, 1200])
end

此外,您不应将 eq 匹配器与 current_path 一起使用,因为它没有 waiting/retrying 行为,因此您的 JS 测试最终会变得不稳定。相反,您应该使用 Capybara 提供的 have_current_path 匹配器。另外,你找到 update_button 的方式有点奇怪,如果你想将它保留在 let 块中,写成 let(:update_button) { find(:button, 'Update') } 会更容易理解,尽管我建议只使用 click_button 代替。

it 'should redirect to detail' do
  visit dashboard_journal_path @journal
  click_button 'Update'
  page.should have_current_path(dashboard_journals_path)
end