从内存中释放Selenium chromedriver.exe

KLI*_*KLI 92 selenium selenium-chromedriver selenium-webdriver

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

dda*_*son 64

根据Selenium API,你真的应该调用,browser.quit()因为这个方法将关闭所有窗口并杀死进程.你还是应该用browser.quit().

但是:在我的工作场所,我们注意到在Java平台上执行chromedriver测试时遇到了一个很大的问题,即使在使用之后chromedriver.exe仍然存在browser.quit().为了解决这个问题,我们创建了一个类似于下面这个的批处理文件,只是强制关闭进程.

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
Run Code Online (Sandbox Code Playgroud)

由于chromedriver.exe不是一个庞大的程序,并且不会占用太多内存,因此您不必每次都运行它,但只有在出现问题时才运行.例如,在Eclipse中运行Project-> Clean时.

  • 查看唯一的问题是,当您调试并终止执行时 - 该过程仍然存在.即使你单击"X",它仍然存在.这是该批处理文件的**唯一**原因.很明显`quit`是要走的路,但是在我的例子中,如果你调试并停止执行 - 它永远不会到达`quit`. (15认同)
  • 根据您使用的测试框架,如果测试在"设置"中失败,您最终可能会出现虚拟进程.例如,如果TestFixtureSetup方法中的某些内容失败,则NUnit将不会调用TestFixtureTearDown方法 - >您创建浏览器,执行某些操作,然后执行测试.如果在"你做一些事情"时出现问题,那就是它,这个过程就在那里. (3认同)
  • 我不能宽恕任何建议杀死进程的答案,而不提及正确结束这些进程的正确方法.如果你正确使用`quit`方法,这应该不是问题.强制杀死进程应该只是最后的手段,你的答案应该反映出来. (2认同)
  • 我正在回答其中一个问题:"我希望有一种方法可以写一些东西来杀死chromedriver.exe进程." 是的,那很好!Java不会这样做 (2认同)

Ric*_*ard 33

browser.close() 将仅关闭当前的chrome窗口.

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

  • 谢谢理查德.`browser.quit()`确实关闭了所有打开的窗口.但是chromedriver.exe没有退出.并且出现错误消息'InvalidURL:nonnumeric port:'port''. (9认同)
  • 好.我试过`browser = webdriver.Firefox()`.`browser.close()`和`browser.quit()`都会关闭所有窗口并释放内存.然而,chromedriver不会这样做. (5认同)

Ill*_*dan 14

从理论上讲,调用browser.Quit将关闭所有浏览器选项卡并终止进程.

但是,在我的情况下,我无法做到这一点 - 因为我并行运行多个测试,我不想进行一次测试来关闭其他人的窗口.因此,当我的测试完成运行时,仍有许多"chromedriver.exe"进程在运行.

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

Process[] chromeDriverProcesses =  Process.GetProcessesByName("chromedriver");

foreach(var chromeDriverProcess in chromeDriverProcesses)
{
     chromeDriverProcess.Kill();
}
Run Code Online (Sandbox Code Playgroud)


kin*_*hat 10

我使用的时候取得过成功driver.close()之前driver.quit().我之前只使用过driver.quit().


Sha*_*onu 8

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


driver.close();

driver.quit();
Run Code Online (Sandbox Code Playgroud)


小智 6

从命令行终止多个进程\n您\xe2\x80\x99需要做的第一件事是打开命令提示符,然后使用具有以下语法的taskkill命令:

\n\n
taskkill /F /IM <processname.exe> /T\n
Run Code Online (Sandbox Code Playgroud)\n\n

这些参数将强制终止与您指定的可执行文件名称匹配的任何进程。例如,要终止所有 iexplore.exe 进程,我们\xe2\x80\x99d 使用:

\n\n
taskkill /F /IM iexplore.exe\n
Run Code Online (Sandbox Code Playgroud)\n\n

在此输入图像描述

\n


Alp*_*han 5

有点奇怪,但对我有用。我遇到了类似的问题,经过一番挖掘后,我发现当我点击时,浏览器中仍在进行UI操作(URL加载左右)WebDriver.Quit()。

对我来说,解决方案(虽然非常讨厌)是Sleep()在调用Quit()之前添加了3秒。

  • 谢谢,这实际上也为我工作。之前我也使用过WebDriver.Quit(),但有时它会保留一个chrome.exe进程。另外,我猜这并不是在所有操作系统上都发生。 (3认同)

aal*_*ane 5

代码 c#

using System.Diagnostics;

using 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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

和这个功能

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.
    }
}
Run Code Online (Sandbox Code Playgroud)

呼唤

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

}
Run Code Online (Sandbox Code Playgroud)


Mat*_*ius 5

这个答案是如何在C#中正确处置驱动程序

如果要使用运行后应用于“整理”的“适当”机制,ChromeDriver 则应使用 IWebDriver.Dispose();

执行与释放,释放或重置非托管资源相关的应用程序定义的任务。(继承自IDisposable。)

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

public class WebDriverController : IDisposable
{
    public IWebDriver Driver;

    public void Dispose()
    {
        this.Driver.Dispose();
    }
}
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

using (var controller = new WebDriverController())
{
  //code goes here
}
Run Code Online (Sandbox Code Playgroud)

希望这可以节省您一些时间

  • 我可以确认此策略仍然存在问题!我正在使用Selenium WebDriver API .NET v3.13.1.0,我的Chrome实例是最新的,我的Windows 10也是最新的...我正在使用ChromeDriver(通过继承实现IDisposposable),例如: = new ChromeDriver()){//这里是我的代码}`有时(并非总是如此)会发生“某事”(不知道是什么?),而根据我的taskmanager仍未发布`chromedriver.exe`。 (4认同)

Wiz*_*ard 5

在 Python 中运行它时我遇到了同样的问题,我必须手动运行“killall”命令来终止所有进程。然而,当我使用 Python上下文管理协议实现驱动程序时,所有进程都消失了。看来 Python 解释器在清理方面做得非常好。

这是实现:


from selenium import webdriver
from selenium.webdriver import ChromeOptions

class Browser:

    def __enter__(self):

        self.options = webdriver.ChromeOptions()

        self.options.add_argument('--headless=new')
        self.options.add_argument('--no-sandbox')

        self.driver = webdriver.Chrome(options=self.options)

        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.driver.close()
        self.driver.quit()
Run Code Online (Sandbox Code Playgroud)

以及用法:

with Browser() as browser:
    browser.driver.get("http://www.example.com")
    html = browser.driver.page_source
    print(html)

Run Code Online (Sandbox Code Playgroud)


小智 5

因此,您可以使用以下内容:

driver.close()
Run Code Online (Sandbox Code Playgroud)

关闭浏览器(模拟点击关闭按钮)

driver.quit()
Run Code Online (Sandbox Code Playgroud)

退出浏览器(模拟选择退出选项)

driver.dispose()
Run Code Online (Sandbox Code Playgroud)

退出浏览器(尝试关闭每个选项卡,然后退出)

但是,如果您仍然遇到挂起实例的问题(就像我一样),您可能还想终止该实例。为此,您需要 chrome 实例的 PID。

driver.close()
Run Code Online (Sandbox Code Playgroud)

如果之后还有剩余的 chrome 实例,我会吃掉我的帽子。:(