Unterschied zwischen webdriver.Dispose (), .Close () und .Quit ()

285

Was ist der Unterschied zwischen diesen

  1. Webdriver.Close()
  2. Webdriver.Quit()
  3. Webdriver.Dispose()

Welches soll wann verwendet werden?

Puran Joshi
quelle
2
Die Methode #dispose wurde anscheinend stillschweigend aus der WebDriver-API entfernt. Keine Erwähnung im Changelog, die letzte Erwähnung, die ich finden konnte, war v2.26 api docs, für die ich den Link nicht mehr finden kann.
Jordanpg
Woher die Verwirrung kommt, sehe ich in den Antworten unten. Ich denke, diese Frage war ursprünglich eine C # -Frage, da die obigen Methoden (Schließen, Beenden und Entsorgen) mit einem Großbuchstaben (C #) beginnen, nicht mit einem Kleinbuchstaben (Java). Dispose wurde nicht aus den C # WebDriver-Clientbindungen entfernt.
rcasady616
Dispose ist ein .NET-Muster und wird daher in den API-Dokumenten von Selen nicht dokumentiert. In RemoteWebDriver ruft Quit Aufrufe Dispose auf, die einen Quit-Befehl senden (DELETE / session / {sessionId}). Auf der Clientseite gibt es mehrere Stellen, an denen der Befehl Beenden abgefangen wird. Die FirefoxDriver .net-Implementierung führt beispielsweise tatsächlich einen process.Kill () -Aufruf aus, wenn der Prozess nicht ordnungsgemäß heruntergefahren wird.
Tamir Daniely

Antworten:

244

Dies ist eine gute Frage, die Leute gesehen haben, die Close () verwenden, wenn sie es nicht sollten. Ich habe im Quellcode nach den Selenium Client & WebDriver C # -Bindungen gesucht und Folgendes festgestellt.

  1. webDriver.Close() - Schließen Sie das Browserfenster, auf das sich der Treiber konzentriert
  2. webDriver.Quit() - Aufrufe Dispose ()
  3. webDriver.Dispose() Schließt alle Browserfenster und beendet die Sitzung sicher

Der folgende Code entsorgt das Treiberobjekt, beendet die Sitzung und schließt alle während eines Tests geöffneten Browser, unabhängig davon, ob der Test fehlschlägt oder erfolgreich ist.

public IWebDriver Driver;

[SetUp]
public void SetupTest()
{
    Driver = WebDriverFactory.GetDriver();
}

[TearDown]
public void TearDown()
{
    if (Driver != null)
      Driver.Quit();
}

Stellen Sie zusammenfassend sicher, dass Quit () oder Dispose () aufgerufen wird, bevor Sie das Programm beenden, und verwenden Sie die Close () -Methode nur, wenn Sie sicher sind, was Sie tun.

Hinweis:
Ich habe diese Frage gefunden, als ich versucht habe, ein verwandtes Problem herauszufinden, warum meinen VMs der Festplattenspeicher ausgeht. Es stellte sich heraus, dass eine Ausnahme dazu führte, dass Quit () oder Dispose () nicht bei jedem Lauf aufgerufen wurden, wodurch der Ordner appData die Festplatte füllte. Wir haben also die Quit () -Methode korrekt verwendet, aber der Code war nicht erreichbar. Zusammenfassung Stellen Sie sicher, dass alle Codepfade Ihre nicht verwalteten Objekte bereinigen, indem Sie ausnahmesichere Muster verwenden oder IDisposable implementieren

Auch
wenn RemoteDriver Quit () oder Dispose () aufruft, wird die Sitzung auf dem Selenium Server geschlossen. Wenn die Sitzung nicht geschlossen wird, bleiben die Protokolldateien für diese Sitzung im Speicher.

rcasady616
quelle
Wie haben Sie Ihre Ausnahmen aktualisiert? Gehen Sie einfach zu jedem und fügen Sie ein quit () hinzu?
Mark Mayo
1
In einem Testrahmen wie NUnit, JUnit müssen Sie nur sicherstellen, dass sich Dispose () in TestTeardown () oder TestFixtureTeardown () befindet. In C # können Sie einfach eine "using" -Anweisung verwenden und Dispose wird immer aufgerufen, wenn eine Ausnahme ausgelöst wird. Sie können etwas Ähnliches in Java tun, indem Sie einen try catch finally verwenden und Dispose in finally setzen.
rcasady616
1
@ rcasady616 Dies ist die beste Erklärung, die ich habe. Danke dafür und ich denke, es ist eine Gegenstimme wert.
RNS
2
@ Mr.Bultitude gut, die verständlich ist, wenn man bedenkt es ist nach dieser Antwort keinen Unterschied ^^, Quit()ist eine Umleitung zuDispose()
Pixelmaster
1
@ PixelMaster, ja sind 100% korrekt, es ist im Grunde eine Weiterleitung. Da ich nicht derjenige bin, der den Code in Selenium geschrieben hat, kann ich nur raten, warum beide Methoden in den C # -Client-Bindungen vorhanden sind. Wahrscheinlich möchten sie eine gemeinsame Methode zum "Beenden" in allen Client-Sprachen beibehalten, aber auch den Treiber in einer "using" -Anweisungssyntax verwenden (für die die Dispose () -Methode erforderlich wäre). Das ist meine beste Vermutung, entweder das oder der Code muss bereinigt werden.
rcasady616
47

Close() - Es wird verwendet, um den Browser oder die Seite zu schließen, die gerade den Fokus hat.

Quit() - Es wird verwendet, um die Webtreiberinstanz herunterzufahren oder die Webtreiberinstanz zu zerstören (Schließen Sie alle Fenster).

Dispose() - Diese Methode ist mir nicht bekannt.

Manigandan
quelle
3
Wenn Sie die .NET - Sprachbindungen verwenden, die Quitund Disposesollten Methoden Synonyme für einander sein. Mit anderen Worten, QuitAnrufe Dispose.
JimEvans
22

driver.closeund driver.quitsind zwei verschiedene Methoden zum Schließen der Browsersitzung in Selenium WebDriver. Für Ihre Testausführung ist es wichtig, beide zu verstehen und zu wissen, wann die einzelnen Methoden anzuwenden sind. Deshalb habe ich versucht, diese beiden Methoden zu beleuchten.

driver.close- Diese Methode schließt das Browserfenster, auf das der Fokus gesetzt ist. Trotz der bekannten Namen für diese Methode, WebDriverist nicht implementieren die AutoCloseableSchnittstelle .

driver.quit- Diese Methode ruft im Grunde driver.disposeeine jetzt interne Methode auf, die wiederum alle Browserfenster schließt und die WebDriver-Sitzung ordnungsgemäß beendet.

driver.dispose- Wie bereits erwähnt, handelt es sich um eine interne Methode von WebDriver, die gemäß einer anderen Antwort stillschweigend gelöscht wurde. - Überprüfung erforderlich. Diese Methode hat in einem normalen Testworkflow wirklich keinen Anwendungsfall, da eine der vorherigen Methoden für die meisten Anwendungsfälle funktionieren sollte.

Erläuterung Anwendungsfall: Sie sollten verwenden, driver.quitwann immer Sie das Programm beenden möchten. Es werden alle geöffneten Browserfenster geschlossen und die WebDriver-Sitzung beendet. Wenn Sie driver.quitam Ende des Programms nicht verwenden , wird die WebDriver-Sitzung nicht ordnungsgemäß geschlossen und die Dateien werden nicht aus dem Speicher gelöscht. Dies kann zu Speicherverlustfehlern führen.

Die obige Erklärung sollte den Unterschied zwischen driver.closeund driver.quitMethoden in WebDriver erklären . Ich hoffe, Sie finden es nützlich.

Auf der folgenden Website finden Sie einige gute Tipps zum Selentest: Link

Anudeep Samaiya
quelle
14

quit(): Beendet diesen Treiber und schließt jedes zugeordnete Fenster, das geöffnet war.

close() : Schließen Sie das aktuelle Fenster und beenden Sie den Browser, wenn es das letzte aktuell geöffnete Fenster ist.

Ran Adler
quelle
Diese Antwort übersieht den Hauptunterschied: quit () stoppt den zugrunde liegenden Webdriver-Dienst, close () nicht. Tipp: Rufen Sie niemals close () an, wenn nur noch ein Fenster übrig ist
Corey Goldberg
5

close (): - Angenommen, Sie haben mehrere Browserfenster mit derselben Treiberinstanz geöffnet. Wenn Sie jetzt close () für die Treiberinstanz aufrufen, wird das aktuelle Fenster geschlossen, auf das die Treiberinstanz verweist. Die Treiberinstanz bleibt jedoch weiterhin im Speicher und kann zur Verarbeitung anderer geöffneter Browserfenster verwendet werden.

quit (): - Wenn Sie quit () für die Treiberinstanz aufrufen und ein oder mehrere Browserfenster geöffnet sind, werden alle geöffneten Browserfenster geschlossen, und die Treiberinstanz wird mit Müll gesammelt, dh aus dem Speicher entfernt. Daher können Sie diese Treiberinstanz jetzt nicht verwenden, um andere Vorgänge auszuführen, nachdem Sie quit () darauf aufgerufen haben. Wenn Sie dies tun, wird eine Ausnahme ausgelöst.

dispose (): - Ich glaube nicht, dass es eine dispose-Methode für eine WebDriver-Instanz gibt.

Sie können zu diesem Selenium offiziellen Java Doc Link als Referenz gehen.

Prasanta Biswas
quelle
"Ich glaube nicht, dass es eine Dispose-Methode für eine WebDriver-Instanz gibt." Sicher gibt es (zumindest in C #).
EJoshuaS
5

Basierend auf einem Problem mit Github von PhantomJS beendet quit () den PhantomJS-Prozess nicht. Du solltest benutzen:

import signal
driver = webdriver.PhantomJS(service_args=service_args)
# Do your work here

driver.service.process.send_signal(signal.SIGTERM)
driver.quit()

Verknüpfung

Wesam Na
quelle
5

close () ist ein Webdriver-Befehl, der das aktuell fokussierte Browserfenster schließt. Trotz der bekannten Namen für diese Methode, WebDriverist nicht implementieren die AutoCloseableSchnittstelle .

Wenn während des Automatisierungsprozesses mehr als ein Browserfenster geöffnet ist, schließt der Befehl close () nur das aktuelle Browserfenster, das zu diesem Zeitpunkt den Fokus hat. Die restlichen Browserfenster werden nicht geschlossen. Der folgende Code kann verwendet werden, um das aktuelle Browserfenster zu schließen:

quit () ist ein Webdriver-Befehl, der die Methode driver.dispose aufruft, die wiederum alle Browserfenster schließt und die WebDriver-Sitzung beendet. Wenn am Ende des Programms nicht quit () verwendet wird, wird die WebDriver-Sitzung nicht ordnungsgemäß geschlossen und die Dateien werden nicht aus dem Speicher gelöscht. Dies kann zu Speicherverlustfehlern führen.

Wenn der Automatisierungsprozess nur ein einziges Browserfenster öffnet, funktionieren die Befehle close () und quit () auf dieselbe Weise. Beide unterscheiden sich in ihrer Funktionalität, wenn während der Automatisierung mehr als ein Browserfenster geöffnet wird.

Für oben Ref: hier klicken

Dispose-Befehl Dispose () sollte Quit () aufrufen, und es scheint, dass dies der Fall ist. Das gleiche Problem besteht jedoch auch darin, dass alle nachfolgenden Aktionen blockiert werden, bis PhantomJS manuell geschlossen wird.

Ref Link

Dhaval Atri
quelle
3

Unterschied zwischen driver.close () & driver.quit ()

driver.close - Schließt das Browserfenster, auf das der Fokus gesetzt ist.

driver.quit - Im Grunde wird die Methode driver.dispose aufgerufen, die wiederum alle Browserfenster schließt und die WebDriver-Sitzung ordnungsgemäß beendet.

Nagarjuna Yalamanchili
quelle
2

Selenium WebDriver

  1. WebDriver.Close()Diese Methode wird verwendet, um das aktuell geöffnete Fenster zu schließen. Es schließt das aktuell geöffnete Fenster, auf das sich der Fahrer konzentriert.

  2. WebDriver.Quit()Diese Methode wird verwendet, um die Instanz von WebDriver zu zerstören. Es schließt alle mit diesem Treiber verknüpften Browserfenster und beendet die Sitzung sicher. WebDriver.Quit () ruft Dispose auf.

  3. WebDriver.Dispose() Diese Methode schließt alle Browserfenster und beendet die Sitzung sicher

s10v10s
quelle
4
Wenn Sie etwas zitieren, sollten Sie die Quelle angeben.
Meirion Hughes
2

Meines Wissens nach driver.close();wird der aktuelle Browser geschlossen und driver.quit();der gesamte Browser beendet.

BIUbiubiu
quelle