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

bis0qfac  于 2023-02-04  发布在  其他
关注(0)|答案(5)|浏览(570)

我无法完全删除项目,因为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();

但通常情况下,当主线程死亡时,所有支持运行的示例也会随之死亡。
这是一个已知问题,还是我编写的脚本有问题。
先谢了。

cygmwpex

cygmwpex1#

您需要处理以下几件事:
1.* 尝试运行此代码,比如说5次,将有5个后台运行示例 :这是因为每次打开一个从未发布的新驱动程序示例时。
1.
尝试重新启动Eclipse,但没有成功 *:值得一提的是Eclipse是一个IDE(集成开发环境),它帮助我们通过编程语言构建编程步骤。因此,通过Eclipse,我们为Selenium编写程序/步骤,以打开/关闭浏览器会话和退出驱动程序会话。但Eclipse无法控制Selenium打开/关闭浏览器会话和退出驱动程序会话的执行。因此,重启Eclipse不会有什么不同。

  1. driver.close():此命令将帮助您仅关闭当前驱动程序具有焦点的浏览器会话/窗口。
    1.* 当主线程终止时,所有支持的运行示例都将随之终止 *:你是对的。每次打开所有浏览器会话的都是WebDriver示例(即驱动程序-根据你的代码)。所以当你的程序结束时,你应该总是调用driver.quit()来关闭所有浏览器窗口,退出驱动程序并安全地结束会话。
    但是,您可以随时通过os特定方法强制终止WebDriver变体(例如geckodriverselenium-chromedriverselenium-iedriver)的所有示例,如下所示:
  • 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()
c9qzyr3d

c9qzyr3d2#

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

taskkill /f /im chromedriver.exe

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

cgvd09ve

cgvd09ve3#

在执行chrome驱动程序时,必须关闭它,正如您提到的,为了关闭chrome驱动程序,基本上为了运行测试,应该使用相关的运行框架,如JUnit(如java),这样就不会混淆。

a14dhokn

a14dhokn4#

使用以下cmd创建bat文件(killchorme.bat
taskkill /f /im文件驱动程序. exe
然后在使用Runtime.getruntime().exec(“killchrome.bat”)启动Chrome驱动程序之前调用bat文件

yvfmudvl

yvfmudvl5#

我知道这是离题,但这帮助我解决了问题chromedriver is still running in the background .我使用的是driver.close,它不会杀死会话.请参阅answer
无论何时要结束程序,都应使用driver.quit。它将关闭所有打开的浏览器窗口并终止WebDriver会话。如果在程序结束时不使用driver.quit,WebDriver会话将无法正确关闭,文件也不会从内存中清除。这可能会导致内存泄漏错误。

相关问题