通过 PID 进程杀死 Selenium 浏览器 [Java]

S.O*_*O.S 6 java windows selenium pid selenium-webdriver

Seleniumdriver.quit()当它卡在“与服务器的连接已重置”或只是“停止响应”时,有时无法在调用后关闭。发生这种情况时,无法WebDriver直接使用杀死进程(浏览器),我能想到的唯一方法是通过检索PID浏览器并销毁进程:

String cmd = "taskkill /F /PID " + pidOfBrowser;
Runtime.getRuntime().exec(cmd);
Run Code Online (Sandbox Code Playgroud)

我知道这个响应建议检索当前正在运行的进程列表并将其过滤到 Firefox 浏览器。但是,正如有人在其中一条评论中指出的那样,如果用户有许多并发会话正在运行并且只想杀死少数几个,这将不起作用。

该线程的评论部分建议的另一个解决方案是在开始之前从浏览器获取 PID 列表,并且只关闭那些在测试开始之前没有运行的(因此在测试开始之前手动启动的任何浏览器都不会关闭)

但是,这不适用于我的情况,因为我从我的程序(不是手动)一次启动了许多浏览器,并且只想关闭一些已启动的浏览器(那些挂起且不再响应的浏览器WebDriver)。

我如何获得PID特定Firefox WebDriver会话(最好是在创建时),以便稍后在进程挂起或“卡住”时终止该进程?

谢谢!

Deb*_*anB 1

您可以终止使用Selenium启动的浏览器实例,从功能对象中检索PID,然后调用如下:getRuntime()taskkill /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"));
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 控制台输出:

    moz:processID value is : 8492
    
    Run Code Online (Sandbox Code Playgroud)