通过PID处理[Java]杀死Selenium浏览器

时间:2019-09-04 17:46:46

标签: java windows selenium selenium-webdriver pid

Selenium停留在“重置与服务器的连接”或仅“停止响应”时,调用driver.quit()后有时无法关闭。发生这种情况时,不可能直接使用WebDriver杀死进程(浏览器),我唯一想到的方法是检索浏览器的PID并通过以下方式破坏进程:

String cmd = "taskkill /F /PID " + pidOfBrowser;
Runtime.getRuntime().exec(cmd);

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

该线程的注释部分建议的另一种解决方案是在启动之前从浏览器获取PID列表,并仅关闭测试开始之前未运行的PID(因此,在测试开始之前手动启动的任何浏览器都不会关闭)

但是,这不适用于我的情况,因为我一次从程序中启动了许多浏览器(不是手动启动),并且只希望关闭某些已启动的浏览器(那些挂起并且没有响应{{ 1}})。

如何获得WebDriver特定会话的PID(理想情况下是在创建会话时),以便稍后在进程挂起或卡住时可以终止该进程?

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以终止使用Seleniumcapabilities对象检索 PID 并随后使用以下命令调用getRuntime()来启动的 Browser 实例: 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"));
        }
    }
    
  • 控制台输出:

    moz:processID value is : 8492
    

答案 1 :(得分:0)

在Java 9+版本中,您可以这样做。它取自here

public static void main(String[] args) {
    ProcessHandle.allProcesses()
            .forEach(process -> System.out.println(processDetails(process)));
}

private static String processDetails(ProcessHandle process) {
    return String.format("%8d %8s %10s %26s %-40s",
            process.pid(),
            text(process.parent().map(ProcessHandle::pid)),
            text(process.info().user()),
            text(process.info().startInstant()),
            text(process.info().commandLine()));
}

private static String text(Optional<?> optional) {
    return optional.map(Object::toString).orElse("-");
}

,然后获得上述过程的infoProcessHandle.Info类中有一个totalCpuDuration​()方法。使用它来查看哪个过程花费很长时间,然后采取相应措施。该类中还有其他方法可能会对您的情况有所帮助。希望这会有所帮助。