【问题标题】:Selenium initiated ChromeDriver keeps running in backgroundSelenium 启动的 ChromeDriver 一直在后台运行
【发布时间】:2023-03-25 19:10:01
【问题描述】:

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

我在删除项目时遇到的错误是:

以下面的代码为例:

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


    【解决方案1】:

    您需要注意以下几点:

    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()
      

    【讨论】:

    • 是的。谢谢你的详细回答。感谢您的深入分析
    【解决方案2】:

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

     taskkill /f /im chromedriver.exe
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 谢谢Yaniv ...我明白这一点,但我无法理解的是chromedriver的运行实例应该关闭,至少在我关闭Eclipse时,不是吗?还有,为什么会有多个实例?
      • 每次调用 chromedriver.exe 时都会打开一个不同的实例。这是一个必须关闭的独立进程,它与 Eclipse 无关。当你调用它被打开时,你应该调用它的 close 方法。
      • 我刚刚尝试使用 driver.close(); 并且发生了同样的事情,而使用 driver.quit(); 可以正常工作。在单个窗口上工作应该没有任何区别,我相信两者应该工作相同。
      • 当然。 Close 只是关闭 chrome 的窗口,而 quit 实际上是为了退出驱动程序。
      【解决方案4】:

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

      taskkill /f /im chromedriver.exe

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

      【讨论】:

      • 这是一种方法,或者只是在代码末尾使用driver.quit();,正如其他人所建议的那样
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-15
      相关资源
      最近更新 更多