352 votes

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

Quelle est la différence entre ces

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

Lequel doit être utilisé et quand ?

2 votes

La méthode #dispose semble avoir été silencieusement supprimée de l'API WebDriver. Aucune mention dans le changelog, la mention la plus récente que j'ai pu trouver était la docs api v2.26, dont je ne trouve plus le lien.

0 votes

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 (Close, Quit et Dispose) commencent par une majuscule (C#) et non par une minuscule (java). Dispose n'a pas été supprimé des liaisons client WebDriver C#.

0 votes

Dispose est un modèle .Net et n'est donc pas documenté dans la documentation de l'API de Selenium. Dans RemoteWebDriver, Quit appelle Dispose, qui envoie une commande Quit (DELETE /session/{sessionId}). Il y a plusieurs endroits du côté client où la commande Quit est interceptée. L'implémentation .net de FirefoxDriver, par exemple, effectue un appel à process.Kill() si le processus ne s'arrête pas de manière élégante.

302voto

rcasady616 Points 340

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 des 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() - Appelle Dispose()
  3. webDriver.Dispose() Ferme toutes les fenêtres du navigateur et met fin à la session en toute sécurité.

Le code ci-dessous disposera de l'objet driver, mettra fin à la session et fermera 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.

Note
J'ai trouvé cette question en essayant de comprendre un problème connexe, à savoir pourquoi mes machines virtuelles manquaient d'espace sur le disque dur. Il s'avère qu'une exception faisait que Quit() ou Dispose() n'étaient pas appelés à chaque exécution, ce qui faisait que le dossier appData remplissait le disque dur. Donc nous utilisions la méthode Quit() correctement mais le code était inaccessible. En résumé, assurez-vous que tous les chemins de code nettoient vos objets non gérés en utilisant des modèles sûrs pour les exceptions ou en implémentant IDisposable.

Aussi
Dans le cas de RemoteDriver, l'appel de Quit() ou Dispose() fermera également la session sur le serveur Selenium. Si la session n'est pas fermée, les fichiers journaux de cette session restent en mémoire.

0 votes

Comment avez-vous mis à jour vos exceptions ? En allant simplement à chacune d'elles et en ajoutant un quit() ?

1 votes

Dans un cadre de test comme NUnit ou JUnit, il suffit de s'assurer que la fonction Dispose() se trouve dans la fonction TestTeardown() ou TestFixtureTeardown(). En C#, il suffit d'utiliser une instruction "using" et Dispose est toujours appelé si une exception est levée. Vous pouvez faire quelque chose de similaire en Java en utilisant un try catch finally et en plaçant Dispose dans le finally.

0 votes

@rcasady616 concernant IDisposable et un test NUnit ou similaire, avez-vous un exemple que vous pouvez fournir ? Nous avons un Destructeur au niveau du test qui appelle Dispose() sur webdriver, mais nous ne sommes pas sûrs que cela soit suffisant ou si nous devons implémenter IDisposable sur une classe de test NUnit. Avez-vous étudié la façon dont une classe de test peut implémenter IDisposable et comment cela peut être appelé à partir du framework de test au moment de l'exécution ? J'aimerais bien le savoir !

55voto

Manigandan Points 1445

Close() - Il est utilisé pour fermer le navigateur ou la page qui a actuellement le focus.

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

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

4 votes

Si vous utilisez les liaisons de langage .NET, l'option Quit y Dispose Les méthodes devraient être synonymes l'une de l'autre. En d'autres termes, Quit appelle Dispose .

45voto

Anudeep Samaiya Points 48

driver.close y driver.quit Il existe deux méthodes différentes pour fermer la session du navigateur dans Selenium WebDriver. Comprendre ces deux méthodes et savoir quand les utiliser est important pour l'exécution de vos tests. J'ai donc essayé de faire la lumière sur ces deux méthodes.

driver.close - Cette méthode permet de fermer la fenêtre du navigateur sur laquelle se trouve le focus. Malgré le nom familier de cette méthode, WebDriver fait no mettre en œuvre la AutoCloseable interface .

driver.quit - Cette méthode appelle essentiellement driver.dispose une méthode désormais interne qui, à son tour, ferme toutes les fenêtres du navigateur et met fin à la session WebDriver de manière élégante.

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

Explication du cas d'utilisation : Vous devriez utiliser driver.quit chaque fois que vous voulez 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 devrait expliquer la différence entre driver.close y driver.quit dans WebDriver. J'espère que vous le trouverez utile.

Le site web suivant donne de bons conseils sur l'analyse du sélénium : Lien

16voto

ran Points 269

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

close() : Ferme la fenêtre actuelle, en quittant le navigateur si c'est la dernière fenêtre actuellement ouverte.

2 votes

Cette réponse ne tient pas compte de la différence essentielle : quit() arrête le service webdriver sous-jacent, alors que close() ne le fait pas. pro-tip : n'appelez jamais close() s'il ne reste qu'une seule fenêtre.

10voto

Dhaval Atri Points 151

fermer() est une commande webdriver qui ferme la fenêtre du navigateur qui est actuellement en focus. Malgré le nom familier de cette méthode, WebDriver fait no mettre en œuvre la AutoCloseable interface .

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

quitter() est une commande webdriver qui appelle la méthode driver.dispose, laquelle ferme à son tour 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. Elles diffèrent dans leur fonctionnement lorsqu'il y a plus d'une fenêtre de navigateur ouverte pendant l'automatisation.

Pour ci-dessus Ref : cliquez ici

Commande d'élimination Dispose() devrait appeler Quit(), et il semble que ce soit le cas. Cependant, le problème est le même : toutes les actions ultérieures sont bloquées jusqu'à ce que PhantomJS soit fermé manuellement.

Réf. Lien

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X