2017-01-23 10 views
1

Ich benutze Capybara mit Selen als sein Fahrer. Ich versuche, auf ein Element zu klicken, das, wenn es angeklickt wird, ein div aufdeckt, aber das Klicken ruft nie Javascript auf, um genau das zu tun.Selen führt Javascript nicht aus

Unten finden Sie den Code Ich habe

scenario 'currently used transport mode cannot be re-selected' do 

expect(page).to have_css("h2.summary") 
expect(find('h2.summary').text).to eq("Single event") 
expect(page).to have_content("Change journey") 
page.click_link("Change journey") 
expect(find('#travel-times-preview').visible?).to be_truthy # FAILS here because of previous step not working 

end 

Fehlermeldung

Capybara :: ElementNotFound: Kann nicht css "# travel-mal-Vorschau"

html finden

<a class="change-journey gray-text" href="#">Change journey</a> 

Javascript-Code

$(".change-journey").on("click", function(e){ 
     var target = $(this).data("preview-target"); 
     $('[data-preview-toggle="'+ target +'"]').toggleClass("hidden"); 
     if($(this).text().indexOf('Change journey') > -1){ 
     $(this).text("Close Preview"); 
     }else{ 
     $(this).text("Change journey"); 
     } 
    e.preventDefault(); 
    }); 

Datenbank Reiniger Setup

config.before(:suite) do 
    if config.use_transactional_fixtures? 

     raise(<<-MSG) 
     Delete line `config.use_transactional_fixtures = true` from rails_helper.rb 
     (or set it to false) to prevent uncommitted transactions being used in 
     JavaScript-dependent specs. 
     During testing, the Ruby app server that the JavaScript browser driver 
     connects to uses a different database connection to the database connection 
     used by the spec. 

     This Ruby app server database connection would not be able to see data that 
     has been setup by the spec's database connection inside an uncommitted 
     transaction. 
     Disabling the use_transactional_fixtures setting helps avoid uncommitted 
     transactions in JavaScript-dependent specs, meaning that the Ruby app server 
     database connection can see any data set up by the specs. 
     MSG 

    end 
    end 

    config.before(:suite) do 
    DatabaseCleaner.clean_with(:truncation) 
    end 

    config.before(:each) do 
    DatabaseCleaner.strategy = :transaction 
    end 

    config.before(:each, type: :feature) do 
    # :rack_test driver's Rack app under test shares database connection 
    # with the specs, so we can use transaction strategy for speed. 
    driver_shares_db_connection_with_specs = Capybara.current_driver == :rack_test 

    if driver_shares_db_connection_with_specs 
     DatabaseCleaner.strategy = :transaction 
    else 
     # Non-:rack_test driver is probably a driver for a JavaScript browser 
     # with a Rack app under test that does *not* share a database 
     # connection with the specs, so we must use truncation strategy. 
     DatabaseCleaner.strategy = :truncation 
    end 
    end 

    config.before(:each) do 
    DatabaseCleaner.start 
    end 

    config.after(:each) do 
    DatabaseCleaner.clean 
    end 

auszuführen, während ich auf den Link geklickt wird, sehen kann, wird die zugrunde liegende Javascript nicht ausgeführt.

+0

Sind Sie sicher, dass Sie auf das richtige Element klicken? Dieser Code bedeutet nichts für uns ohne 'HTML' – Andersson

+0

@Andersson Ich habe den HTML-Link hinzugefügt. Beachten Sie, dass es funktioniert, wenn Sie keine Testumgebung verwenden und nicht manuell testen. Es scheint sich um einen Fehler zu handeln, bei dem e.preventDefault() nicht ausgelöst wird. Stattdessen wird die Seite erneut geladen, wenn auf diesen Link geklickt wird. –

+0

Sie sollten diese Frage auch mit "Capybara" kennzeichnen, da Sie das verwenden - nicht gerade Selen –

Antwort

1

Vorausgesetzt, Sie haben sich in der Dev-Konsole im Firefox-Fenster angeschaut und es gibt keine JS-Fehler, es gibt einige mögliche Gründe für das Verhalten, das Sie sehen, von denen nichts mit e.preventDefault() (wenn Sie hören, Hufe denken Pferde, nicht Zebras)

  1. der Link, den Sie zeigen keinen data-preview-target Attribut also nichts für den Click-Handler gibt es zu data-preview-toggle= zu lesen und hängen so umgeschaltet nichts bekommt. Es ist möglich, dass Daten von anderen JS in Ihrer App hinzugefügt werden, so dass sie als Eigenschaft festgelegt werden und kein Attribut im HTML waren (oder Sie haben nur dieses Detail aus dem Element entfernt, das Sie angezeigt haben), das auf # 2

  2. verschoben wird
  3. Ihr .on JS-Code wird ausgeführt, bevor das Element existiert und daher nicht angehängt wird. Dies kann im Testmodus auftreten, wenn alle JS in einer Datei verkettet werden, da JS schneller geladen wird, als wenn mehrere Anforderungen im Entwicklungsmodus gestellt werden. Dies würde angezeigt werden, wenn sich der Linktext nicht ändert, da der Click-Handler überhaupt nicht ausgeführt wird. Wenn dies der Fall ist, verzögern Sie das Anhängen des Listeners, bis das DOM geladen ist.

  4. Dies ist der erste JS-Unterstützungstest, den Sie schreiben, die Elemente, die ausgeblendet/angezeigt werden, werden aus Datenbankeinträgen generiert und Transaktionstests wurden nicht deaktiviert und/oder database_cleaner nicht korrekt konfiguriert. Dies führt dazu, dass Objekte, die Sie in Ihren Tests erstellen, in Ihrer App nicht wirklich sichtbar sind. Daher ist das Element, das Sie auf der Seite erwarten, nicht vorhanden. Sie können dies überprüfen, indem Sie den Test pausieren und im HTML nachsehen, ob er sich auf der Seite befindet oder nicht.

  5. Basierend auf dem Fehler, den Sie zur Verfügung gestellt haben, ist dies nicht die Ursache Ihres Problems, sondern fügt nur die Vollständigkeit der Antwort hinzu: click_link klickt auf den Link und kehrt sofort zurück. Das bedeutet, dass der Test weiterhin ausgeführt wird, während die durch den Klick ausgelöste Aktion fortgesetzt wird. Dies kann zu einer Wettlaufsituation in Ihrem Code führen (wenn Sie Capybara.ignore_hidden_elements = false eingestellt haben - schlechte Idee), wo Ihr Code das Element findet und seine Sichtbarkeit überprüft, bevor es geändert wird.Aus diesem Grunde Ihr letzter Schritt sollte wie unten beschrieben werden, da sie warten/Retry für das Element

    expect(page).to have_css('#travel-times-preview', visible: true) 
    

Als sichtbar zu werden beiseite, kann Ihr Testcode verbessert und beschleunigt durch die Merkmale mit Capybara bietet

scenario 'currently used transport mode cannot be re-selected' do 

    expect(page).to have_css("h2.summary", text: "Single event") # do it in one query 
    page.click_link("Change journey") # click_link will find the content anyway so no need to check for it before 
    expect(page).to have_css('#travel-times-preview') # By default Capybara only finds visible elements so checking visibility is pointeless, if you've changed that default see #4 

end 
+0

Hey Thomas danke für Ihre ausführliche Antwort Ich möchte antworten, da der Schuldige noch zu finden ist. Ich werde jeden Punkt beantworten, den Sie gemacht haben. 1. Sie haben Recht, ich habe Daten-Vorschau-Toggle ausgelassen. 2. Die ganze Funktion ist in eine andere Funktion eingepackt, die beim Ereignis "turbolinks: load" aufgerufen wird. 3. Ja, das ist mein erster Abnahmetest - ich werde den Beitrag bearbeiten und die Datenbank-Reiniger-Konfiguration hinzufügen - aber mit dem Befehl 'save_and_open_page' oder mit Selen beim Öffnen des Browsers kann ich den Datensatz dort sehen. 4.Der Code, den Sie zur Verfügung gestellt haben, funktioniert immer noch nicht. –

+0

@PetrosKyriakou Ihr database_cleaner config after block sollte append_after sein, wie in den database_cleaner docs - https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example gezeigt. Es würde nicht Ihr aktuelles Problem verursachen, aber es würde Ihre Tests flockig machen. Haben Sie in der Firefox-Konsole keine Fehler bestätigt, wenn Sie den Test nach dem click_link anhalten? Welche Version von Turbolinks verwenden Sie? Außerdem wird das Szenario nicht mit 'js: true' angezeigt - ich nehme an, es befindet sich weiter oben in der Baumstruktur (oder Firefox würde sich beim Ausführen des Tests nicht öffnen) –

+0

Hey, ich benutze 'Capybara.current_driver =: Selen im Hintergrund (: alle) Block dieser Spezifikation - nichts anderes und es eröffnet Firefox. Ja, keine Fehler in der Konsole. Ich benutze Rails 5 denke, dass seine Turbolinks 5 (was auch immer mit Schienen 5 geliefert wird). BTW mit dem Code, den Sie zur Verfügung gestellt haben, ist der Fehler ein wenig anders 'erwartet, css zu finden" # Reise-Zeiten-Vorschau ", aber es gab keine Übereinstimmungen. Auch gefunden "", die den Selektor, aber nicht alle Filter abgestimmt. Danke für die Datenbank sauberer Tipp obwohl es auschecken. Ist es möglich, wegen Turbolinks Ereignis? –