liberar Selenium chromedriver.exe de memoria

Configuré un código python para ejecutar Selenium chromedriver.exe . Al final de la ejecución, tengo browser.close() para cerrar la instancia. ( browser = webdriver.Chrome() ) Creo que debería liberar chromedriver.exe de la memoria (estoy en Windows 7). Sin embargo, después de cada ejecución, hay una instancia de chromedriver.exe permanece en la memoria. Espero que haya una manera en que pueda escribir algo en python para matar el proceso chromedriver.exe . Obviamente browser.close() no hace el trabajo. Gracias.

según la API de Selenium, debería llamar a browser.quit() ya que este método cerrará todas las ventanas y matará el proceso. Aún deberías usar browser.quit() .

Sin embargo : en mi lugar de trabajo, hemos notado un gran problema al tratar de ejecutar las pruebas chromedriver en la plataforma Java, donde chromedriver.exe todavía existe incluso después de usar browser.quit() . Para contrarrestar esto, creamos un archivo por lotes similar al siguiente, que simplemente obliga a cerrar los procesos.

kill_chromedriver.bat

 @echo off rem just kills stray local chromedriver.exe instances. rem useful if you are trying to clean your project, and your ide is complaining. taskkill /im chromedriver.exe /f 

Como chromedriver.exe no es un progtwig enorme y no consume mucha memoria, no debes ejecutar esta característica cada vez, sino solo cuando exista un problema. Por ejemplo, al ejecutar Project-> Clean en Eclipse.

browser.close() cerrará solo la ventana actual de cromo.

browser.quit() debería cerrar todas las ventanas abiertas, luego salir de webdriver.

En teoría, al llamar a browser.Quit se cerrarán todas las tabs del navegador y se cerrará el proceso.

Sin embargo, en mi caso no pude hacer eso, ya que al ejecutar varias pruebas en paralelo, no quise hacer una prueba para cerrar las ventanas a los demás. Por lo tanto, cuando mis pruebas terminen de ejecutarse, todavía quedan muchos procesos “chromedriver.exe” en ejecución.

Para superar eso, escribí un código de limpieza simple (C #):

 Process[] chromeDriverProcesses = Process.GetProcessesByName("chromedriver"); foreach(var chromeDriverProcess in chromeDriverProcesses) { chromeDriverProcess.Kill(); } 

Tuve éxito al usar driver.close() antes de driver.quit() . Anteriormente solo estaba usando driver.quit() .

 //Calling close and then quit will kill the driver running process. driver.close(); driver.quit(); 

Es un poco extraño pero funciona para mí. Tuve el problema similar, después de algunas búsquedas descubrí que todavía había una acción de IU en el navegador (carga de URL, aproximadamente), cuando WebDriver.Quit() .

La solución para mí (aunque muy desagradable) era agregar un Sleep() de 3 segundos antes de llamar a Salir ().

Código c #

usando System.Diagnostics;

usando System.Management;

  public void KillProcessAndChildren(string p_name) { ManagementObjectSearcher searcher = new ManagementObjectSearcher ("Select * From Win32_Process Where Name = '"+ p_name +"'"); ManagementObjectCollection moc = searcher.Get(); foreach (ManagementObject mo in moc) { try { KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"])); } catch (ArgumentException) { break; } } } 

y esta función

  public void KillProcessAndChildren(int pid) { ManagementObjectSearcher searcher = new ManagementObjectSearcher ("Select * From Win32_Process Where ParentProcessID=" + pid); ManagementObjectCollection moc = searcher.Get(); foreach (ManagementObject mo in moc) { try { KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"])); } catch { break; } } try { Process proc = Process.GetProcessById(pid); proc.Kill(); } catch (ArgumentException) { // Process already exited. } } 

Vocación

  try { KillProcessAndChildren("chromedriver.exe"); } catch { } 

Ninguna de las respuestas anteriores es completamente correcta

Si desea utilizar un mecanismo ‘adecuado’ que debería usarse para ‘ordenar’ después de ejecutar ChromeDriver , debe usar IWebDriver.Dispose();

Realiza tareas definidas por la aplicación asociadas con liberar, liberar o restablecer recursos no administrados. (Heredado de IDisposable)

Normalmente implemento IDisposable en la clase que trata con IWebDriver

 public class WebDriverController : IDisposable { public IWebDriver Driver; public void Dispose() { this.Driver.Dispose(); } } 

y úsalo como:

 using (var controller = new WebDriverController()) { //code goes here } 

Espero que esto te ahorre algo de tiempo

Tuve el mismo problema al ejecutarlo en Python y tuve que ejecutar manualmente el comando ‘killall’ para matar todos los procesos. Sin embargo, cuando implementé el controlador utilizando el protocolo de administración de contexto de Python , todos los procesos desaparecieron. Parece que el intérprete de Python hace un buen trabajo limpiando cosas.

Aquí está la implementación:

 class Browser: def __enter__(self): self.options = webdriver.ChromeOptions() self.options.add_argument('headless') self.driver = webdriver.Chrome(chrome_options=self.options) return self def __exit__(self, exc_type, exc_val, exc_tb): self.driver.close() self.driver.quit() 

Y el uso:

 with Browser() as browser: browser.navigate_to_page() 

Sé que esta es una vieja pregunta, pero pensé que compartiría lo que funcionó para mí. Estaba teniendo problemas con Eclipse, no mataría los procesos, así que tuve un montón de procesos fantasmas dando vueltas después de probar el código usando el corredor Eclipse.

Mi solución fue ejecutar Eclipse como administrador. Eso lo solucionó para mí. Parece que Windows no permitía a Eclipse cerrar el proceso que generó.

Tengo este problema. Sospecho que es debido a la versión de Serenity BDD y Selenium. El proceso del cromedriver nunca se libera hasta que finaliza todo el conjunto de pruebas. Solo hay 97 pruebas, pero tener 97 procesos que consumen la memoria de un servidor que no tiene muchos recursos puede estar afectando el rendimiento.

Para abordar hice 2 cosas (esto es específico de Windows).

  1. antes de cada prueba (anotada con @Before) obtenga la identificación del proceso (PID) del proceso del cromedriver con:

     List pids = new ArrayList(); String out; Process p = Runtime.getRuntime().exec("tasklist /FI \"IMAGENAME eq chromedriver.exe*\""); BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); while ((out = input.readLine()) != null) { String[] items = StringUtils.split(out, " "); if (items.length > 1 && StringUtils.isNumeric(items[1])) { pids.add(NumberUtils.toInt(items[1])); } } 
  2. después de cada prueba (anotada con @After) mata el PID con:

     Runtime.getRuntime().exec("taskkill /F /PID " + pid); 

Vine aquí pensando que seguramente esto habría sido respondido / resuelto, pero después de leer todas las respuestas, estaba un poco sorprendido de que nadie intentara unir los tres métodos:

 try { blah } catch { blah } finally { driver.Close(); // Close the chrome window driver.Quit(); // Close the console app that was used to kick off the chrome window driver.Dispose(); // Close the chromedriver.exe } 

Solo estuve aquí para buscar respuestas y no tenía la intención de proporcionar una. Entonces la solución anterior se basa solo en mi experiencia. Estaba usando el controlador de Chrome en una aplicación de consola C # y pude limpiar los procesos persistentes solo después de llamar a los tres métodos juntos.

Para usuarios de Ubuntu / Linux: el comando es pkill o killall . pkill generalmente se recomienda, ya que en algunos sistemas, killall realmente matará a todos los procesos.

He usado el siguiente en nightwatch.js en afterEach hooks.

 afterEach: function(browser, done) { // performing an async operation setTimeout(function() { // finished async duties done(); browser.closeWindow(); browser.end(); }, 200); } 

.closeWindow () simplemente cierra la ventana. (Pero no funcionará para múltiples ventanas abiertas). Mientras que .end () finaliza todos los procesos restantes de Chrome.

Elimine varios procesos de la línea de comandos Lo primero que debe hacer es abrir un símbolo del sistema y luego usar el comando taskkill con la siguiente syntax:

 taskkill /F /IM  /T 

Estos parámetros matarán a la fuerza cualquier proceso que coincida con el nombre del ejecutable que especifique. Por ejemplo, para eliminar todos los procesos de iexplore.exe, usaríamos:

 taskkill /F /IM iexplore.exe 

enter image description here

En pocas palabras … tienes que matar el proceso de alguna manera porque los diseñadores no lo incorporaron. Todas las demás formas pueden dejar un proceso en marcha y eso es suficiente para justificar la muerte.