从内存中释放Selenium chromedriver.exe

我设置了一个python代码来运行Selenium chromedriver.exe 。 在运行结束时,我有browser.close()来closures实例。 ( browser = webdriver.Chrome() )我相信它应该从内存释放chromedriver.exe (我在Windows 7上)。 但是,每次运行后有一个chromedriver.exe实例保留在内存中。 我希望有一种方法,我可以用python写一些东西来杀死chromedriver.exe进程。 很明显, browser.close()不做这个工作。 谢谢。

每个Selenium API,你真的应该调用browser.quit()因为这个方法将closures所有窗口并杀死进程。 你仍然应该使用browser.quit()

但是 :在我的工作场所,我们注意到在Java平台上执行chromedrivertesting时发现了一个很大的问题,即使在使用browser.quit()后,chromedriver.exe仍然存在。 为了解决这个问题,我们创build了一个类似于下面这个的batch file,只是强制closures进程。

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 

由于chromedriver.exe不是一个庞大的程序,不会消耗太多的内存,所以你不应该每次都运行这个程序,而只能在程序出现问题的时候运行。 例如,在Eclipse中运行Project-> Clean。

browser.close()将只closures当前的chrome窗口。

browser.quit()应该closures所有打开的窗口,然后退出webdriver。

理论上,调用browser.Quit将closures所有的浏览器标签,并终止进程。

然而,在我的情况下,我无法做到这一点 – 因为我并行运行多个testing,我不想一个人closures窗口的testing。 因此,当我的testing运行完成后,仍然有很多“chromedriver.exe”进程正在运行。

为了克服这个问题,我写了一个简单的清理代码(C#):

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

这有点奇怪,但它对我有用。 我有类似的问题,经过一些挖掘,我发现,仍然有一个UI操作正在浏览器(URL加载或这样),当我打WebDriver.Quit()

对于我来说,解决scheme(尽pipe非常讨厌)是在调用Quit()之前添加一个3秒的Sleep() ()。

上面的答案都不是完全正确的

如果你想在运行ChromeDriver之后使用“适当的”机制来“整理”, 你应该使用 IWebDriver.Dispose();

执行与释放,释放或重置非托pipe资源相关联的应用程序定义的任务。 (从IDisposableinheritance。)

我通常在处理IWebDriver类上实现IDisposable

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

并使用它像:

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

希望这可以为你节省一些时间

driver.quit()之前使用driver.close()时,我已经成功了。 我以前只使用driver.quit()

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

我知道这是一个老问题,但我想我会分享一下对我有用的东西。 我在使用Eclipse时遇到了问题 – 它不会终止进程,所以在使用Eclipse Runnertesting代码之后,我有一大堆幻像进程。

我的解决scheme是以pipe理员身份运行Eclipse。 这为我修好了。 似乎Windows不允许Eclipseclosures它产生的进程。

代码c#

使用System.Diagnostics;

使用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; } } } 

和这个function

  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. } } 

调用

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

我有这个问题。 我怀疑它是由于Serenity BDD和Selen版本的缘故。 在整个testing套件完成之前,chromedriver进程永远不会释放。 只有97个testing,但是有97个进程吃掉没有太多资源的服务器的内存可能会对性能产生影响。

为了解决我做了2件事(这是特定于Windows)。

  1. 在每个testing之前(用@Before注释)获取chromedriver进程的进程ID(PID):

     List<Integer> pids = new ArrayList<Integer>(); 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. 每次testing后(用@After注释)杀死PID:

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

我最初来到这里是想,这个问题肯定会得到解决,但是在读完所有答案之后,我感到有些惊讶,没有人试图把所有的三种方法联系在一起:

 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 } 

我只是在这里寻找答案,并不打算提供答案。 所以上面的解决scheme只是基于我的经验。 我在C#控制台应用程序中使用了chrome驱动程序,只有在将所有三种方法调用在一起之后,我才能够清除延迟的进程。

底线…你必须以某种方式杀死这个过程,因为devise者没有build立它。所有其他的方式可能会让一个进程运行,这足以保证杀死。 我可以select。