2016-07-26 33 views
0

Ich habe Capybara/poltergeist/phantomjs eingerichtet, um einige UI-Tests durchzuführen. Mein erstes Experiment ist folgendes:Sollte Capybara/poltergeist/phantomjs meinen JS während der Tests laufen lassen?

it 'can like a photo', :js => true do 
    visit root_path(as: 1) 

    page.first("img.lazy").trigger('click') 
    save_screenshot('/Users/martinhinge/Downloads/file.png') 
    within("#control-sidebar-tab-photo") do 
     page.find("#like").click 
     expect("#control-sidebar-tab-photo #like").to have_css(".btn-success") 
    end 
    end 

ich einen Screenshot vor

page.first("img.lazy").trigger('click') 

und alles geladen ist fein vom Server.

die

page.first("img.lazy").trigger('click') 

einige Javascript auslösen soll einen Seitenstreifen zu öffnen (funktioniert in meiner App in Ordnung). Aber wenn ich es laufe passiert nichts.

Sollten Phantomjs die js ausführen?

--o EDIT o--

ich den Klick-Trigger geändert haben:

first("img.lazy", minimum: 1).click 

, wenn ich das tue ich:

Capybara :: Poltergeist :: MouseEventFailed : Ein Klick auf Koordinaten [83, 227] fehlgeschlagen. Poltergeist hat ein anderes Element mit CSS-Selektor entdeckt 'html body.fixed.index.photos.sidebar-collapse.sidebar-mini.skin-black div.wrapper div.content-wrapper abschnitt.inhalt div.row div # photogrid div. col-lg-12.col-sm-12 div.box.box-massiv div.box-body.infinite-container div.photo-widget div.photo-widget-content div.photo-widget-header 'at Diese Position. Es überlappt möglicherweise das Element, mit dem Sie interagieren möchten. Wenn Sie nicht über überlappende Elemente kümmern, versuchen Sie node.trigger ('klicken').

habe ich versucht, es an sich verändernde:

first(".photo-widget-header", minimum: 1).click 

Jetzt oben bekomme ich den Fehler nicht, aber die JS ausgelöst werden nicht. Der Grund, warum ich weiß, dass die JS nicht ausgelöst wird, ist, dass das Element '#like' nicht gefunden wird.

+0

haben Sie versucht 'page.first (" img.lazy "). Klicken Sie auf"? " – siegy22

+0

Ich habe ... Ich bekomme eine Fehlermeldung, dass es überlappende Elemente gibt und dass ich Trigger verwenden soll. Ich habe versucht, den Trigger-Befehl im Debug-Modus ausgeführt und es ist erfolgreich – martin

Antwort

1

Ja, es sollte das JS laufen. Sie sollten auch .click anstelle von .trigger ('klicken') aufrufen, wenn Sie wirklich möchten, dass Ihre Benutzeroberfläche funktioniert. trigger('click') prüft, ob ein Element tatsächlich anklickbar ist und daher eine Reihe von Fehlern verbergen kann. Zusätzlich first wie Sie es verwendet haben, wird das Warteverhalten von Capybara umgehen und kann zu flockigen Tests führen, so dass Sie wahrscheinlich first("img.crazy", minimum: 1) verwenden oder Capybara.wait_on_first_by_default = true festlegen möchten.

Warum Sie nicht das erwartete Verhalten sehen, wenn Sie nur auf dem Screenshot basieren, könnte es sein, dass der Screenshot vor dem Öffnen des Panels passiert, weil Klicks asynchron auftreten. Es könnte auch sein, dass der Klick nicht das richtige Element trifft (benutze .click anstelle von .trigger und es wird dir sagen) was bedeuten kann, dass du ein größeres window_size Set in deiner Treiberregistrierung brauchst (Fenster nicht breit genug und Elemente kollabieren) (oder auf eine andere Debugguing), um herauszufinden, warum auf das Element, auf das Sie klicken, nicht geklickt wird. Eine andere Möglichkeit ist ein JS-Fehler - stellen Sie sicher, dass js_errors: true in Ihrer Treiberregistrierung festgelegt ist.Stellen Sie auch sicher, dass Sie PhantomJS 2.1.1+

+0

Ich benutze PhantomJS 2.1.1. Ich werde meine Frage mit HTML und JS erweitern, um das Setup auszuarbeiten – martin

+0

Ich habe das versucht: Capybara.wait_on_first_by_default = true. - Keine Veränderung ... Ich verstehe nicht, was Sie sagen, wenn Sie das Fenster größer machen - das könnte mein Problem sein. Kannst du mich auf Doco ausarbeiten? – martin

+0

@martin Wenn Sie Ihren Treiber registrieren, können Sie die Standardfenstergröße einstellen - https://github.com/teampoltergeist/poltergeist#customization - Sie möchten die Option 'window_size' auf die Größe einstellen, mit der Ihre App nutzbar sein soll. - Dort würden Sie auch 'js_errors: true' setzen, damit JS-Fehler angezeigt werden –