2017-03-13 5 views
0

Ich benutze Capybara, um meine Knopfklick-Funktion zu testen.Capybara :: Poltergeist :: MouseEventFailed. Poltergeist hat ein anderes Element entdeckt

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 

Wenn ich die div mit Klassennamen ‚rights_link‘ aus meiner Sicht entfernen, erhalte ich den Fehler nicht

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)>' 

diese Datei

meiner Sicht ist
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 

Bitte geben Sie eine Lösung.

Ich versuchte

update_button.trigger(:click) 

Aber keine Hilfe verwenden. Bitte beachten Sie: Das Div vor dem 'rights_link' Div ist versteckt und wird in einigen Fällen angezeigt.

+0

Hallo, ich verstehe nicht, was meinst du mit 'nein Hilfe'? –

+0

.trigger (: click) hat den Fehler nicht behoben. –

Antwort

1

Erstens, wenn Sie eine App testen, verwenden Sie nicht #trigger. Der wichtige Teil der Fehlermeldung, die die Verwendung von #trigger vorschlägt, ist "Wenn Sie sich nicht um überlappende Elemente kümmern". Wenn Sie eine App testen, sollten Sie sich darum kümmern, da Sie sonst zulassen, dass der Test Dinge tut, die ein Benutzer nicht tun kann (beim Screen Scraping oder bei der Automatisierung eines Prozesses ist das eine andere Geschichte).

Der Fehler erklärt, was das Problem ist, Sie haben Elemente, die einander überlappen, und können oft behoben werden, indem Sie eine größere Fenstergröße in Ihrer Poltergeist-Treiberkonfiguration angeben. Sie können normalerweise sehen, warum sich Dinge überschneiden, indem Sie save_and_open_screenshot direkt vor dem Klick-Schritt aufrufen und den Screenshot betrachten. Wenn die Seite zu schmal oder zu kurz ist, können Sie die Fenstergröße in der erforderlichen Richtung vergrößern.

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

Zusätzlich sollten Sie nicht die eq Matcher mit current_path verwenden, weil es keine Warte/retrying Verhalten so Ihre JS Test wird am Ende flockig zu sein hat. Stattdessen sollten Sie den have_current_path Matcher von Capybara verwenden. Auch die Art, wie Sie die update_button finden, ist etwas seltsam und wenn Sie es in einem let Block behalten möchten, wäre verständlicher als let(:update_button) { find(:button, 'Update') } geschrieben, obwohl ich würde vorschlagen, nur click_button stattdessen zu verwenden.

Verwandte Themen