Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 硒启动的铬驱动程序在后台运行_Java_Selenium_Selenium Webdriver_Webdriver_Selenium Chromedriver_Geckodriver_Selenium Iedriver_Os - Fatal编程技术网

Java 硒启动的铬驱动程序在后台运行

Java 硒启动的铬驱动程序在后台运行,java,selenium,selenium-webdriver,webdriver,selenium-chromedriver,geckodriver,selenium-iedriver,os,Java,Selenium,Selenium Webdriver,Webdriver,Selenium Chromedriver,Geckodriver,Selenium Iedriver,Os,我无法完全删除项目,因为chromedriver实例在后台运行,即使没有执行任何代码。 请看下图。 删除项目时出现的错误是: 以下面的代码为例: import java.util.concurrent.TimeUnit; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class Test { public static void main(S

我无法完全删除项目,因为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();
但通常,当主线程死亡时,所有支持运行的实例都应该随之死亡

这是一个已知的问题,还是我编写了一些错误的脚本


提前感谢。

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

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

 taskkill /f /im chromedriver.exe

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

您需要注意以下几点:

  • 试着运行这段代码,比如说5次,将会有5个后台运行实例:这是因为每次打开一个从未发布过的新驱动程序实例

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

  • driver.close()
    :此命令仅帮助您关闭当前驱动程序关注的浏览器会话/窗口

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


  • 但是,在任何时候,您都可以强制杀死WebDriver变体的所有实例,例如,通过以下特定方法:

    • Java解决方案(Windows):

    • Python解决方案(Windows):

    • Python解决方案(跨平台):

    使用以下命令创建bat文件(killchorme.bat)

    taskkill/f/im chromedriver.exe

    然后调用bat文件,然后使用启动chrome驱动程序
    Runtime.getruntime().exec(“killchrome.bat”)

    谢谢Yaniv。。。我理解这一点,但我不能理解的是chromedriver的运行实例应该被关闭,至少在我关闭Eclipse时,是不是?还有,为什么会有多个实例?每次调用chromedriver.exe时,都会打开一个不同的实例。它是一个独立的进程,您必须关闭它,它与Eclipse无关。当您调用它来打开时,您应该调用它的close方法driver.quit()时,同样的情况也会发生按照我的预期工作。在一个窗口上工作时不应该有任何区别,我相信两个窗口应该工作相同。当然。Close只是关闭chrome的窗口,而quit实际上是为了退出驱动程序。这是一种方法,或者只是使用
    driver.quit()在代码末尾,如其他人所建议。谢谢你的详细回答。感谢您的深入分析
    
    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");
        }
    }
    
    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")
    
    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()