2012-05-25 2 views
8

Also, wenn ich meine Tests einzeln ausführen, funktionieren sie großartig. Wenn ich jedoch meine Funktion (mehrere Tests) ausführe, schlägt mein Code fehl.
Dies ist, weil, wenn Capybara existiert, nicht alle meine Fenster schließen und daher meine Selen Treiber nicht wissen, welches Fenster zu verwenden.Können Sie alle geöffneten Fenster in Capybara schließen?

Grundsätzlich passiert, dass mein Test mehrere Fenster öffnet. Dies geschieht, weil meine Tests auf Links klicken, die neue Fenster öffnen und den Inhalt in den neuen Fenstern überprüfen. Obwohl ich am Ende jedes Tests page.quit sage, schließt diese Funktion nicht alle geöffneten Fenster (schließt das aktive Fenster, aber nicht das ursprüngliche Fenster). Wenn der 2. Test ausgeführt wird, verwendet er das ursprünglich erstellte Fenster, aber wenn das neue Popup geöffnet wird, verwendet es das falsche Fenster.

Wie kann ich sicherstellen, dass bei jedem Test ein neuer Browser verwendet wird und alle Fenster des vorherigen Tests geschlossen sind.
Ich verwende derzeit page.reset! und page.quit.
Nicht sicher, aber kann ich session.quit sagen, um alle geöffneten Browserfenster zu schließen?

Antwort

1

Versuchen Sie Folgendes:

page.driver.browser.window_handles.each do |handle| 
    page.driver.browser.switch_to.window(handle) 
    page.quit 
end 

(Ich denke, es wird funktionieren, aber ich habe keine Chance zu testen, es hatte.)

+1

Dies funktioniert nicht, die 'quit' Funktion existiert nicht. Gleiches gilt für Schließen. – Jason

+1

Dies funktioniert nicht – Jason

+0

Dies funktioniert jedoch nach dem Zufallsprinzip.Diesmal gab es mir 'Fehler/Fehler: Kann keine passende Zeile von Backtrace finden Selenium :: WebDriver :: Fehler :: NoSuchWindowError: getUrl Ausführung fehlgeschlagen; Das Fenster konnte nicht gefunden werden – Ava

3

Ich benutze diesen Code Stück Pop-ups für den Zugriff auf und schließen Sie sie nach . Es sollte nicht viel Unterschied

within_window(page.driver.browser.window_handles.last) do 
    click buttons and stuff... 
    ... 
    page.driver.browser.close #closes popup 
end 

sein Hoffe, es

+0

Dies funktioniert nicht, da alle Ressourcen verloren sind und der 2. Test schlägt fehl, sagen "Browser nicht gefunden" oder etwas in diese Richtung. – Jason

8

Dieser Code funktioniert hilft:

page.execute_script "window.close();" 

führe ich ihn nur während im Fenster I schließen möchten.

+0

Dieser Code funktioniert nicht, wenn Sie ein Plugin wie dreckige Formulare verwenden, und eine schmutzige Form auf dem Bildschirm haben, in diesem Fall erscheint das Javascript ein "Bist du sicher" -Alarm und die Seite ist nicht geschlossen. Viel besser "page.reset"! bevor Sie den Test ausführen. – Rob

+0

'page.execute_script" window.close(); "' funktioniert nicht für mich. Sollte ohne das ';' sein, d. H. 'Page.execute_script" window.close() "' –

3
page.driver.browser.window_handles.each do |handle| 
    page.driver.browser.switch_to.window(handle) 
    page.execute_script "window.close()" 

end 

Hat den Charme für mich. Kombination von @Jason und @ Justins Antworten.

Danke!

1

Try this:

tab_id = page.driver.find_window("http://google.com.au") 
page.driver.browser.switch_to.window(tab_id) 
page.driver.quit 

Das ist für mich gearbeitet.

0

Fügen Sie diese auf Ihre Funktion Tests, wird es die Session-Cookies zurücksetzen und den Test auf einer leeren Seite beginnen:

# Window washing - use a clean window before every example 
before(:example) do 
    page.reset! 
end 
1

Um alle Behauptungen in Spec-Datei zu haben, ich geben Kontrolle zu neue Seite (Fenster) nach Assertionen Ausführen I geschlossen neue Seite und geleitet Steuer zur ursprünglichen Seite als Balg:

after(:each) do 
    expect(@static_page.has_logo?).to eq(true) # assertion in new page 
    page.execute_script('window.close()') # close new page 
    switch_to_window(windows.first) # return control to first page 
end