通过PID进程[Java]杀死GeckoDriver

时间:2019-11-06 06:19:20

标签: selenium selenium-webdriver process pid geckodriver

我的问题与this question非常相似。我启动了许多WebDriver实例,其中一些实例没有响应driver.quit()。如this response中所述,我可以通过以下代码直接从功能对象中检索PID 来杀死浏览器实例:

  • 代码块:

    import java.io.IOException;
    import org.openqa.selenium.Capabilities;
    import org.openqa.selenium.WebDriver;
    import org.openqa.selenium.firefox.FirefoxDriver;
    import org.openqa.selenium.remote.RemoteWebDriver;
    
    public class Kill_Firefox_PID {
    
        public static void main(String[] args) throws IOException {
    
            System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
            WebDriver driver = new FirefoxDriver();
            Capabilities cap = ((RemoteWebDriver) driver).getCapabilities();
            System.out.println("moz:processID value is : "+cap.getCapability("moz:processID"));
            Runtime.getRuntime().exec("taskkill /PID "+cap.getCapability("moz:processID"));
        }
    }
    
  • 控制台输出:

    moz:processID value is : 8492
    

尽管这样做可以很好地杀死浏览器本身,但是当我打开任务管理器时,仍然看到Geckodriver的实例。如另一个线程所述,我无法通过Geckdriver随意杀死所有taskkill /f /im geckodriver.exe个实例,因为需要一些实例。

简而言之,我希望能够通过功能来检索Geckodriver的PID,并以类似于我们能够检索{{的PID的方式1}},如in response to this question所述。

这可能吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

在调用时会启动一组新的 GeckoDriver Firefox浏览器

WebDriver driver = new FirefoxDriver();
  

您可以在Is this correct - FirefoxDriver driver = new FirefoxDriver();?

中找到详细的讨论

当您调用以下命令时, GeckoDriver / Firefox浏览器的寿命将不复存在:

driver.quit()
  

您可以在PhantomJS web driver stays in memory

中找到详细的讨论

解决方案

因此,一种通用的解决方案将是,不保持/保存的陈旧实例调用 close() quit() 按照测试执行流程进行,这将使您免于滥杀所有 GeckoDriver 实例。

但是,如果要杀死所有 GeckoDriver 实例,则在测试执行结束时,可以使用以下解决方案:

public class Killing_GeckoDriver_PID {

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

        String line;
        String pidInfo ="";
        System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");
        WebDriver driver = new FirefoxDriver();
        Process p =Runtime.getRuntime().exec(System.getenv("windir") +"\\system32\\"+"tasklist.exe");
        BufferedReader input =  new BufferedReader(new InputStreamReader(p.getInputStream()));
        while ((line = input.readLine()) != null) {
            pidInfo+=line; 
        }
        input.close();

        if(pidInfo.contains("geckodriver.exe"))
        {
            Runtime.getRuntime().exec("taskkill /F /IM geckodriver.exe"); 
        }
        System.out.println("Killed all the instances of GeckoDriver");
    }
}
  

您可以在讨论Selenium : How to stop geckodriver process impacting PC memory, without calling driver.quit()?

中找到另一种方法