通过 PID 进程杀死 GeckoDriver [Java] [英] Kill GeckoDriver by PID Process [Java]

查看:173
本文介绍了通过 PID 进程杀死 GeckoDriver [Java]的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的问题与这个问题非常相似.我启动了许多 WebDriver 实例,其中一些不响应 driver.quit().如此响应中所述,我可以通过从功能对象中直接检索 PID 来终止浏览器实例通过以下代码:

  • 代码块:

    import java.io.IOException;导入 org.openqa.selenium.Capabilities;导入 org.openqa.selenium.WebDriver;导入 org.openqa.selenium.firefox.FirefoxDriver;导入 org.openqa.selenium.remote.RemoteWebDriver;公共类 Kill_Firefox_PID {public static void main(String[] args) 抛出 IOException {System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");WebDriver 驱动程序 = 新的 FirefoxDriver();Capabilities cap = ((RemoteWebDriver) driver).getCapabilities();System.out.println("moz:processID 值为:"+cap.getCapability("moz:processID"));Runtime.getRuntime().exec("taskkill/PID "+cap.getCapability("moz:processID"));}}

  • 控制台输出:

    moz:processID 值为:8492

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

简而言之,我希望能够通过功能检索 Geckodriver 的 PID,并以类似的方式销毁 Geckodriver 的那些实例(通过 PID)检索 Firefox WebDriver 的 PID,如响应这个问题.

这可能吗?

谢谢!

解决方案

一组新的 GeckoDriverFirefox Browser 在您调用时启动:

WebDriver driver = new FirefoxDriver();

<块引用>

您可以在这是正确的-FirefoxDriver 驱动程序 = 新的 FirefoxDriver();?

<小时>

GeckoDriver/Firefox Browser 的生命周期在您调用时不复存在:

driver.quit()

<块引用>

您可以在 PhantomJS Web 驱动程序停留在内存中找到详细讨论

<小时>

解决方案

所以一个通用的解决方案是,而不是保留/保留 调用 close()quit() 根据测试执行流程,这将使您免于不加选择地杀死所有 GeckoDriver 实例.

但是,在测试执行结束时,如果您想终止所有GeckoDriver实例,您可以使用以下解决方案:

公共类 Killing_GeckoDriver_PID {public static void main(String[] args) 抛出 IOException {字符串线;字符串 pidInfo ="";System.setProperty("webdriver.gecko.driver", "C:\\Utility\\BrowserDrivers\\geckodriver.exe");WebDriver 驱动程序 = 新的 FirefoxDriver();进程 p =Runtime.getRuntime().exec(System.getenv("windir") +"\\system32\\"+"tasklist.exe");BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));while ((line = input.readLine()) != null) {pidInfo+=行;}input.close();if(pidInfo.contains("geckodriver.exe")){Runtime.getRuntime().exec("taskkill/F/IM geckodriver.exe");}System.out.println("杀死了所有 GeckoDriver 实例");}}

<块引用>

您可以在讨论中找到替代方法 Selenium:如何在不调用 driver.quit() 的情况下停止影响 PC 内存的 geckodriver 进程?

My question is very similar to this question. I launch many instances of WebDriver and some of them don't respond to driver.quit(). As described in this response I am able to kill browser instance by retrieving PID directly from capabilities object via the following code:

  • Code Block:

    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"));
        }
    }
    

  • Console Output:

    moz:processID value is : 8492
    

While this works excellently to kill browser itself I still see instances of Geckodriver when I open task manager. As stated in the other thread I am unable to indiscriminately kill all Geckdriver instances via taskkill /f /im geckodriver.exe as there are some instances that are needed.

In short, I want to be able to retrieve PID of Geckodriver via capabilities and destroy those instances of Geckodriver (via PID) in a similar way that we are able to retrieve PID of Firefox WebDriver as outlined in response to this question.

Is this possible?

Thanks!

解决方案

A new set of GeckoDriver and Firefox Browser are initiated when you invoke:

WebDriver driver = new FirefoxDriver();

You can find a detailed discussion in Is this correct - FirefoxDriver driver = new FirefoxDriver();?


The life span of GeckoDriver / Firefox Browser ceases to exist when you invoke:

driver.quit()

You can find a detailed discussion in PhantomJS web driver stays in memory


Solution

So a generic solution would be, instead of keeping the keeping/preserving the stale instances of invoke close() or quit() as per the flow of your test execution which will relieve you from indiscriminately killing all the GeckoDriver instances.

However at the end of your Test Execution if you want to kill all the GeckoDriver instances, you can use the following solution:

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");
    }
}

You can find a alternative approach within the discussion Selenium : How to stop geckodriver process impacting PC memory, without calling driver.quit()?

这篇关于通过 PID 进程杀死 GeckoDriver [Java]的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆