Différence entre webdriver.Dispose (), .Close () et .Quit ()

285

Quelle est la différence entre ces

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

Lequel utiliser et quand?

Puran Joshi
la source
2
La méthode #dispose semble avoir été silencieusement supprimée de l'API WebDriver. Aucune mention dans le changelog, la plus récente mention que j'ai pu trouver était la documentation api v2.26, pour laquelle je ne trouve plus le lien.
jordanpg
Je vois d'où vient la confusion dans les réponses ci-dessous. Je pense que cette question était à l'origine une question C # car les méthodes ci-dessus (Fermer, Quitter et Supprimer) commencent par une lettre majuscule (C #) et non une lettre minuscule (java). Dispose n'a pas été supprimé des liaisons client C # WebDriver.
rcasady616
Dispose est un modèle .Net et n'est donc pas documenté dans les documents d'API de sélénium. Dans RemoteWebDriver, Quit appelle Dispose, qui envoie une commande Quit (DELETE / session / {sessionId}). Il existe plusieurs emplacements côté client où la commande Quit est interceptée. La mise en œuvre de FirefoxDriver .net, par exemple, fera en fait un appel process.Kill () si le processus ne s'arrête pas correctement.
Tamir Daniely

Réponses:

244

C'est une bonne question. J'ai vu des gens utiliser Close () alors qu'ils ne devraient pas. J'ai regardé dans le code source pour les liaisons Selenium Client & WebDriver C # et j'ai trouvé ce qui suit.

  1. webDriver.Close() - Fermez la fenêtre du navigateur sur laquelle le pilote a le focus
  2. webDriver.Quit() - Appels Dispose ()
  3. webDriver.Dispose() Ferme toutes les fenêtres du navigateur et termine la session en toute sécurité

Le code ci-dessous supprime l'objet pilote, met fin à la session et ferme tous les navigateurs ouverts pendant un test, que le test échoue ou réussisse.

public IWebDriver Driver;

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

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

En résumé, assurez-vous que Quit () ou Dispose () est appelé avant de quitter le programme et n'utilisez la méthode Close () que si vous êtes sûr de ce que vous faites.

Remarque
J'ai trouvé cette question lorsque j'essaie de comprendre un problème connexe pourquoi mes machines virtuelles manquaient d'espace sur le disque dur. Il s'avère qu'une exception empêchait Quit () ou Dispose () d'être appelé à chaque exécution, ce qui provoquait le remplissage du dossier appData sur le disque dur. Nous utilisions donc correctement la méthode Quit () mais le code était inaccessible. Résumé assurez-vous que tous les chemins de code nettoieront vos objets non gérés en utilisant des modèles d'exception ou implémentez IDisposable

De plus,
dans le cas où RemoteDriver appelle Quit () ou Dispose (), la session sera également fermée sur le serveur Selenium. Si la session n'est pas fermée, les fichiers journaux de cette session restent en mémoire.

rcasady616
la source
Comment avez-vous mis à jour vos exceptions? Allez simplement à chacun et ajoutez un quit ()?
Mark Mayo
1
Dans un cadre de test comme NUnit, JUnit, il vous suffit de vous assurer que Dispose () se trouve dans TestTeardown () ou TestFixtureTeardown (). En C #, vous pouvez simplement utiliser une instruction "using" et Dispose est toujours appelé si une exception est déclenchée. Vous pouvez faire quelque chose de similaire en Java en utilisant finalement un try catch et en mettant le Dispose dans le finally.
rcasady616
1
@ rcasady616 C'est la meilleure explication que j'ai. Merci pour cela et je pense que cela vaut la peine de voter.
RNS
2
@ Mr.Bultitude bien, c'est compréhensible, vu qu'il n'y a pas de différence ^^ Selon cette réponse, Quit()c'est une redirection versDispose()
PixelMaster
1
@PixelMaster, oui sont 100% corrects, c'est essentiellement une redirection. N'étant pas celui qui a écrit le code dans Selenium, je ne peux que deviner pourquoi les deux méthodes sont présentes dans les liaisons client C #. Probablement, ils veulent conserver une méthode commune pour "Quitter" dans toutes les langues clientes, mais veulent également utiliser le pilote dans une syntaxe d'instruction "using" (qui nécessiterait la méthode Dispose ()). C'est ma meilleure supposition, soit cela, soit le code doit être nettoyé.
rcasady616
47

Close() - Il est utilisé pour fermer le navigateur ou la page actuellement en cours de mise au point.

Quit() - Il est utilisé pour arrêter l'instance de pilote Web ou détruire l'instance de pilote Web (Fermez toutes les fenêtres).

Dispose() - Je ne connais pas cette méthode.

Manigandan
la source
3
Si vous utilisez les liaisons de langage .NET, les méthodes Quitet Disposedoivent être synonymes les unes des autres. En d'autres termes, les Quitappels Dispose.
JimEvans
23

driver.closeet driver.quitdeux méthodes différentes pour fermer la session du navigateur dans Selenium WebDriver. Il est important de comprendre les deux et de savoir quand utiliser chaque méthode dans l'exécution de votre test. Par conséquent, j'ai essayé de faire la lumière sur ces deux méthodes.

driver.close- Cette méthode ferme la fenêtre du navigateur sur laquelle le focus est défini. Malgré le nom familier de cette méthode, WebDrivern'implémente pas l' AutoCloseableinterface .

driver.quit- Cette méthode appelle essentiellement driver.disposeune méthode désormais interne qui, à son tour, ferme toutes les fenêtres du navigateur et met fin à la session WebDriver avec élégance.

driver.dispose- Comme mentionné précédemment, est une méthode interne de WebDriver qui a été supprimée en silence selon une autre réponse - Vérification nécessaire. Cette méthode n'a vraiment pas de cas d'utilisation dans un flux de travail de test normal, car l'une des méthodes précédentes devrait fonctionner pour la plupart des cas d'utilisation.

Explication du cas d'utilisation: vous devez utiliser driver.quitchaque fois que vous souhaitez terminer le programme. Il fermera toutes les fenêtres de navigateur ouvertes et mettra fin à la session WebDriver. Si vous n'utilisez pas driver.quità la fin du programme, la session WebDriver ne se fermera pas correctement et les fichiers ne seront pas effacés de la mémoire. Cela peut entraîner des erreurs de fuite de mémoire.

L'explication ci-dessus doit expliquer la différence entre les méthodes driver.closeet driver.quitdans WebDriver. J'espère que tu trouves cela utile.

Le site Web suivant contient de bons conseils sur les tests de sélénium: Lien

Anudeep Samaiya
la source
J'ai également remarqué que les IEDrivers utilisés pour travailler avec l'automatisation basée sur IE ne se ferme pas si vous utilisez la méthode driver.close (). J'ai dû utiliser driver.quit () pour y mettre fin. C'est parce que la méthode quit () semble également nettoyer les ressources contrairement à close (), bien que, dans mon exemple, j'ai toujours un seul onglet.
Pavan Dittakavi
14

quit(): Quitte ce pilote, fermant toutes les fenêtres associées qui étaient ouvertes.

close() : Fermez la fenêtre actuelle, quittez le navigateur s'il s'agit de la dernière fenêtre actuellement ouverte.

Ran Adler
la source
cette réponse passe à côté de la principale différence: quit () arrêtera le service de pilote Web sous-jacent, tandis que close () ne le fera pas. pro-tip: n'appelez jamais close () s'il ne reste qu'une fenêtre
Corey Goldberg
5

close (): - Supposons que vous ayez ouvert plusieurs fenêtres de navigateur avec la même instance de pilote, maintenant appeler close () sur l'instance de pilote fermera la fenêtre actuelle vers laquelle l'instance de pilote est pointée. Mais l'instance de pilote reste en mémoire et peut être utilisée pour gérer d'autres fenêtres de navigateur ouvertes.

quit (): - Si vous appelez quit () sur l'instance de pilote et qu'il y a une ou plusieurs fenêtres de navigateur ouvertes, cela fermera toutes les fenêtres de navigateur ouvertes et l'instance de pilote sera récupérée, c'est-à-dire supprimée de la mémoire. Vous ne pouvez donc plus utiliser cette instance de pilote pour effectuer d'autres opérations après avoir appelé quit () dessus. Si vous le faites, il lèvera une exception.

dispose (): - Je ne pense pas qu'il existe une méthode de disposition pour une instance WebDriver.

Vous pouvez aller sur ce lien java doc officiel de sélénium pour référence.

Prasanta Biswas
la source
"Je ne pense pas qu'il existe une méthode de suppression pour une instance WebDriver." Bien sûr qu'il y en a (au moins en C #).
EJoshuaS
5

Basé sur un problème sur Github de PhantomJS, le quit () ne met pas fin au processus PhantomJS. Tu devrais utiliser:

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

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

lien

Wesam Na
la source
5

close () est une commande de pilote Web qui ferme la fenêtre du navigateur qui est actuellement active. Malgré le nom familier de cette méthode, WebDrivern'implémente pas l' AutoCloseableinterface .

Pendant le processus d'automatisation, s'il y a plus d'une fenêtre de navigateur ouverte, la commande close () ne fermera que la fenêtre de navigateur actuelle qui a le focus à ce moment. Les autres fenêtres du navigateur ne seront pas fermées. Le code suivant peut être utilisé pour fermer la fenêtre actuelle du navigateur:

quit () est une commande webdriver qui appelle la méthode driver.dispose, qui à son tour ferme toutes les fenêtres du navigateur et met fin à la session WebDriver. Si nous n'utilisons pas quit () à la fin du programme, la session WebDriver ne sera pas fermée correctement et les fichiers ne seront pas effacés de la mémoire. Cela peut entraîner des erreurs de fuite de mémoire.

Si le processus d'automatisation n'ouvre qu'une seule fenêtre de navigateur, les commandes close () et quit () fonctionnent de la même manière. Les deux diffèrent dans leurs fonctionnalités lorsque plusieurs fenêtres de navigateur sont ouvertes pendant l'automatisation.

Pour la référence ci-dessus: cliquez ici

Dispose Command Dispose () devrait appeler Quit (), et il semble que ce soit le cas. Cependant, il a également le même problème en ce que toutes les actions suivantes sont bloquées jusqu'à ce que PhantomJS soit fermé manuellement.

Lien de référence

Dhaval Atri
la source
3

Différence entre driver.close () et driver.quit ()

driver.close - Il ferme la fenêtre du navigateur sur laquelle le focus est défini.

driver.quit - Il appelle essentiellement la méthode driver.dispose qui à son tour ferme toutes les fenêtres du navigateur et termine la session WebDriver avec élégance.

Nagarjuna Yalamanchili
la source
2

Selenium WebDriver

  1. WebDriver.Close()Cette méthode est utilisée pour fermer la fenêtre ouverte actuelle. Il ferme la fenêtre ouverte actuelle sur laquelle le pilote se concentre.

  2. WebDriver.Quit()Cette méthode est utilisée pour détruire l'instance de WebDriver. Il ferme toutes les fenêtres du navigateur associées à ce pilote et termine la session en toute sécurité. WebDriver.Quit () appelle Dispose.

  3. WebDriver.Dispose() Cette méthode ferme toutes les fenêtres du navigateur et termine la session en toute sécurité

s10v10s
la source
4
si vous citez quelque chose, vous devez en donner la source.
Meirion Hughes
2

Ma compréhension est de driver.close();fermer le navigateur actuel et de driver.quit();mettre fin à tout le navigateur.

BIUbiubiu
la source