Diferencia entre webdriver.Dispose (), .Close () y .Quit ()

285

Cuál es la diferencia entre esto

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

¿Cuál usar y cuándo?

Puran Joshi
fuente
2
El método #dispose parece haberse eliminado silenciosamente de la API WebDriver. No se menciona en el registro de cambios, la mención más reciente que pude encontrar fue v2.26 api docs, que ya no puedo encontrar el enlace.
jordanpg
Veo de dónde viene la confusión en las respuestas a continuación. Creo que esta pregunta era originalmente una pregunta de C # ya que los métodos anteriores (Cerrar, Salir y Eliminar) comienzan con una letra mayúscula (C #), no una letra minúscula (Java). Dispose no se ha eliminado de los enlaces de cliente WebDriver de C #.
rcasady616
Dispose es un patrón .Net y, por lo tanto, no está documentado en los documentos API de selenium. En RemoteWebDriver, Quit llama a Dispose, que envía un comando Quit (DELETE / session / {sessionId}). Hay varios lugares en el lado del cliente donde se intercepta el comando Salir. La implementación de FirefoxDriver .net, por ejemplo, en realidad hará un proceso. Llamada Kill () si el proceso no se cierra correctamente.
Tamir Daniely

Respuestas:

244

Esta es una buena pregunta que he visto a personas usar Close () cuando no deberían. Busqué en el código fuente los enlaces Selenium Client & WebDriver C # y encontré lo siguiente.

  1. webDriver.Close() - Cierre la ventana del navegador en la que se centra el controlador
  2. webDriver.Quit() - Descartar llamadas ()
  3. webDriver.Dispose() Cierra todas las ventanas del navegador y finaliza la sesión de forma segura.

El siguiente código eliminará el objeto del controlador, finaliza la sesión y cierra todos los navegadores abiertos durante una prueba, ya sea que la prueba falle o pase.

public IWebDriver Driver;

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

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

En resumen, asegúrese de llamar a Quit () o Dispose () antes de salir del programa, y ​​no use el método Close () a menos que esté seguro de lo que está haciendo.

Tenga en cuenta
que encontré esta pregunta cuando traté de descubrir un problema relacionado por el cual mis máquinas virtuales se estaban quedando sin espacio en el disco duro. Resulta que una excepción estaba causando que no se llamara a Quit () o Dispose () en cada ejecución, lo que causó que la carpeta appData llene el disco duro. Así que estábamos usando el método Quit () correctamente pero el código era inalcanzable. Resumen asegúrese de que todas las rutas de código limpiarán sus objetos no administrados mediante el uso de patrones seguros de excepción o implementarán IDisposable

También
en el caso de RemoteDriver, al llamar a Quit () o Dispose () también se cerrará la sesión en el servidor Selenium. Si la sesión no se cierra, los archivos de registro para esa sesión permanecen en la memoria.

rcasady616
fuente
¿Cómo actualizaste tus excepciones? Simplemente vaya a cada uno y agregue un quit ()?
Mark Mayo
1
En un marco de prueba como NUnit, JUnit solo tiene que asegurarse de que Dispose () está en TestTeardown () o TestFixtureTeardown (). En C #, puede usar una instrucción "using" y siempre se llama a Dispose si se genera una excepción. Puede hacer algo similar en Java mediante el uso de un try catch finalmente y poner el Dispose en el finalmente.
rcasady616
1
@ rcasady616 Esta es la mejor explicación que tengo. Gracias por ello y creo que merece la pena votar.
RNS
2
@ Mr.Bultitude bueno, eso es comprensible, teniendo en cuenta que es ninguna diferencia ^^ De acuerdo con esta respuesta, Quit()es una redirección aDispose()
pixelmaster
1
@PixelMaster, Sí, son 100% correctos, es básicamente una redirección. Al no ser quien escribió el código en Selenium, solo puedo adivinar por qué ambos métodos están presentes en los enlaces de clientes de C #. Probablemente quieran seguir un método común para "Salir" en todos los idiomas del cliente, pero también querían usar el controlador en una sintaxis de instrucción "usar" (que requeriría el método Dispose ()). Esa es mi mejor suposición, ya sea eso o el código debe limpiarse.
rcasady616
47

Close() - Se utiliza para cerrar el navegador o la página que actualmente está teniendo el foco.

Quit() - Se utiliza para cerrar la instancia del controlador web o destruir la instancia del controlador web (cierre todas las ventanas).

Dispose() - No conozco este método.

Manigandan
fuente
3
Si está utilizando los enlaces de lenguaje .NET, los métodos Quity Disposedeberían ser sinónimos entre sí. En otras palabras, Quitllamadas Dispose.
JimEvans
22

driver.closey driver.quitson dos métodos diferentes para cerrar la sesión del navegador en Selenium WebDriver. Comprenderlos a ambos y saber cuándo usar cada método es importante en la ejecución de su prueba. Por lo tanto, he tratado de arrojar algo de luz sobre estos dos métodos.

driver.close- Este método cierra la ventana del navegador en la que se establece el foco. A pesar del nombre familiar para este método, WebDriverno no implementar el AutoCloseableinterfaz .

driver.quit- Este método básicamente llama a driver.disposeun método ahora interno que a su vez cierra todas las ventanas del navegador y finaliza la sesión de WebDriver con gracia.

driver.dispose- Como se mencionó anteriormente, es un método interno de WebDriver que se ha eliminado silenciosamente de acuerdo con otra respuesta: se necesita verificación. Este método realmente no tiene un caso de uso en un flujo de trabajo de prueba normal, ya que cualquiera de los métodos anteriores debería funcionar para la mayoría de los casos de uso.

Explicación del caso de uso: debe usarlo driver.quitsiempre que desee finalizar el programa. Cerrará todas las ventanas abiertas del navegador y finalizará la sesión de WebDriver. Si no lo utiliza driver.quital final del programa, la sesión de WebDriver no se cerrará correctamente y los archivos no se borrarán de la memoria. Esto puede provocar errores de pérdida de memoria.

La explicación anterior debe explicar la diferencia entre driver.closey los driver.quitmétodos en WebDriver. Espero que le sea útil.

El siguiente sitio web tiene algunos buenos consejos sobre las pruebas de selenio: Enlace

Anudeep Samaiya
fuente
14

quit(): Sale de este controlador y cierra todas las ventanas asociadas que estaban abiertas.

close() : Cierre la ventana actual y salga del navegador si es la última ventana abierta actualmente.

Ran Adler
fuente
esta respuesta pierde la diferencia clave: quit () detendrá el servicio webdriver subyacente, mientras que close () no. pro-tip: nunca llame a close () si solo queda una ventana
Corey Goldberg
5

close (): - Suponga que ha abierto varias ventanas del navegador con la misma instancia del controlador, ahora al llamar a close () en la instancia del controlador cerrará la ventana actual a la que apunta la instancia del controlador. Pero la instancia del controlador aún permanece en la memoria y se puede usar para manejar otras ventanas abiertas del navegador.

quit (): - Si llama a quit () en la instancia del controlador y hay una o más ventanas abiertas del navegador, cerrará todas las ventanas abiertas del navegador y la instancia del controlador es basura recolectada, es decir, eliminada de la memoria. Entonces, ahora no puede usar esta instancia de controlador para realizar otra operación después de llamar a quit () en ella. Si lo haces, lanzará una excepción.

dispose (): - No creo que haya un método de eliminación para una instancia de WebDriver.

Puede ir al enlace oficial de este documento java doc de selenio como referencia.

Prasanta Biswas
fuente
"No creo que haya un método de eliminación para una instancia de WebDriver". Claro que sí (al menos en C #).
EJoshuaS - Restablece a Monica el
5

Basado en un problema en Github de PhantomJS, quit () no termina el proceso PhantomJS. Deberías usar:

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

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

enlace

Wesam Na
fuente
5

close () es un comando webdriver que cierra la ventana del navegador que está actualmente en foco. A pesar del nombre familiar para este método, WebDriverno no implementar el AutoCloseableinterfaz .

Durante el proceso de automatización, si hay más de una ventana de navegador abierta, entonces el comando close () cerrará solo la ventana actual del navegador que se está enfocando en ese momento. Las ventanas restantes del navegador no se cerrarán. El siguiente código se puede usar para cerrar la ventana actual del navegador:

quit () es un comando webdriver que llama al método driver.dispose, que a su vez cierra todas las ventanas del navegador y finaliza la sesión de WebDriver. Si no usamos quit () al final del programa, la sesión de WebDriver no se cerrará correctamente y los archivos no se borrarán de la memoria. Esto puede provocar errores de pérdida de memoria.

Si el proceso de Automatización abre solo una ventana del navegador, los comandos close () y quit () funcionan de la misma manera. Ambos diferirán en su funcionalidad cuando haya más de una ventana de navegador abierta durante la Automatización.

Para la referencia anterior: haga clic aquí

El comando Dispose Dispose () debería llamar a Quit (), y parece que sí. Sin embargo, también tiene el mismo problema porque las acciones posteriores se bloquean hasta que PhantomJS se cierra manualmente.

Enlace de referencia

Dhaval Atri
fuente
3

Diferencia entre driver.close () y driver.quit ()

driver.close: cierra la ventana del navegador en la que se establece el foco.

driver.quit: básicamente llama al método driver.dispose que a su vez cierra todas las ventanas del navegador y finaliza la sesión de WebDriver con gracia.

Nagarjuna Yalamanchili
fuente
2

Selenium WebDriver

  1. WebDriver.Close()Este método se utiliza para cerrar la ventana abierta actual. Cierra la ventana abierta actual en la que se centra el controlador.

  2. WebDriver.Quit()Este método se usa para destruir la instancia de WebDriver. Cierra todas las ventanas del navegador asociadas con ese controlador y finaliza la sesión de forma segura. WebDriver.Quit () llama a Dispose.

  3. WebDriver.Dispose() Este método cierra todas las ventanas del navegador y finaliza la sesión de forma segura

s10v10s
fuente
44
Si cita algo, debe dar la fuente.
Meirion Hughes
2

Tengo entendido driver.close();que cerrará el navegador actual y driver.quit();terminará todo el navegador que.

BIUbiubiu
fuente