Selenium 启动的 ChromeDriver 保持在后台运行

问题描述 投票:0回答:6

我无法完全删除项目,因为 chromedriver 实例正在后台运行,即使没有代码正在执行。 请看下图。 Task Manager Process View

我在删除项目时遇到的错误是:Eclipse error while project deletion

以下面的代码为例:

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Test {

    public static void main(String[] args) throws Exception {

        String url = "https://www.google.com";
        System.setProperty("webdriver.chrome.driver", "src/driver/chromedriver.exe");
        WebDriver driver = new ChromeDriver();
        driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
        driver.get(url);
        System.out.println(driver.getTitle());

    }
}

尝试运行这段代码,比如说5次,就会有5个后台运行实例。尝试重新启动 Eclipse,但没有成功。

我知道发生这种情况是因为我没有写这行:

driver.close();

但通常情况下,当主线程终止时,所有支持运行的实例都应该随之终止。

这是一个已知问题,还是我编写的脚本有问题。

提前致谢。

java selenium selenium-webdriver webdriver selenium-chromedriver
6个回答
7
投票

您需要注意以下几件事:

  1. 尝试运行这段代码,比如说5次,就会有5个后台运行实例:这是因为每次你都打开了一个你从未释放过的新驱动程序实例。

  2. 尝试重启Eclipse,没有成功:值得一提的是,Eclipse是一个IDE(集成开发环境),它可以帮助我们通过编程语言构建编程步骤。因此,通过 Eclipse,我们为 Selenium 编写程序/步骤来打开/关闭浏览器会话并退出驱动程序会话。但 Eclipse 无法控制 Selenium 在打开/关闭浏览器会话和退出驱动程序会话方面的执行。因此重新启动 Eclipse 不会有任何影响。

  3. driver.close()
    :此命令将帮助您仅关闭当前驱动程序具有焦点的浏览器会话/窗口。

  4. 当主线程死亡时,所有支持运行的实例都应该随之死亡:你是对的。它是 WebDriver 实例(即驱动程序 - 根据您的代码)每次都会打开所有浏览器会话。因此,当您的程序结束时,您应该始终调用

    driver.quit()
    ,它会关闭所有浏览器窗口,退出驱动程序并安全结束会话。


但是,您可以在任何时候强制终止 WebDriver 变体的所有实例,例如通过具体方法如下:

  • Java 解决方案(Windows):

    import java.io.IOException;
    
    public class Kill_ChromeDriver_GeckoDriver_IEDriverserver 
    {
        public static void main(String[] args) throws Exception 
        {
            Runtime.getRuntime().exec("taskkill /F /IM geckodriver.exe /T");
            Runtime.getRuntime().exec("taskkill /F /IM chromedriver.exe /T");
            Runtime.getRuntime().exec("taskkill /F /IM IEDriverServer.exe /T");
        }
    }
    
  • Python 解决方案(Windows):

    import os
    os.system("taskkill /f /im geckodriver.exe /T")
    os.system("taskkill /f /im chromedriver.exe /T")
    os.system("taskkill /f /im IEDriverServer.exe /T")
    
  • Python 解决方案(跨平台):

    import os
    import psutil
    
    PROCNAME = "geckodriver" # or chromedriver or IEDriverServer
    for proc in psutil.process_iter():
        # check whether the process name matches
        if proc.name() == PROCNAME:
            proc.kill()
    

3
投票

由于 chromedriver 是一个可执行文件,因此它作为单独的线程运行,并且不会被关闭,因为您的 driver.close() 方法没有被调用,所以您除了手动关闭它之外别无选择。您可以选择从任务管理器手动关闭 chromedriver.exe 进程,但我建议在命令提示符中使用以下命令

 taskkill /f /im chromedriver.exe

可以运行此特定命令来删除 Windows 设备上运行的任何进程。


2
投票

我知道这是题外话,但这帮助我解决了问题

chromedriver is still running in the background
。我使用的是
driver.close
,它不会终止会话。看这个答案

每当您想结束程序时,都应该使用

driver.quit
。它 将关闭所有打开的浏览器窗口并终止 WebDriver 会议。如果您在程序结束时不使用
driver.quit
,则 WebDriver 会话将无法正确关闭,文件也不会被 从内存中清除。这可能会导致内存泄漏错误。


1
投票

执行 chrome-driver 时,必须将其关闭,如您所提到的,才能关闭 chrome-driver。基本上,为了运行测试,您应该使用相关的运行框架,如 JUnit(对于 java),这样您就不会感到困惑。


1
投票

使用下面的cmd创建一个bat文件(killchorme.bat)

taskkill /f /im chromedriver.exe

然后在启动 chrome 驱动程序之前调用 bat 文件 Runtime.getruntime().exec("killchrome.bat")


0
投票

对于我使用 macos/linux 来说,杀死那些正在运行的后台的命令是

pkill -f chromedriver
pkill -f webdriver
© www.soinside.com 2019 - 2024. All rights reserved.