Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.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 如何关闭selenium打开的所有空闲web浏览器?_Java_Selenium_Selenium Webdriver_Selenium Chromedriver_Google Chrome Headless - Fatal编程技术网

Java 如何关闭selenium打开的所有空闲web浏览器?

Java 如何关闭selenium打开的所有空闲web浏览器?,java,selenium,selenium-webdriver,selenium-chromedriver,google-chrome-headless,Java,Selenium,Selenium Webdriver,Selenium Chromedriver,Google Chrome Headless,我正在使用“SeleniumJava.jar”文件打开chrome无头驱动程序。 现在,我们正在使用线程打开无头铬。现在,如果出现任何错误,线程会在不关闭浏览器的情况下退出 因此,我想实施一个解决方案,如果任何无头铬是理想的最后20分钟,然后关闭/退出它 我在谷歌上搜索了一下,找到了可能的解决方案,这是一个类似于selenium服务器的独立解决方案 我的问题是我现在无法切换到独立服务器,所以我必须用当前库找出解决方案 那么,有没有办法关闭所有闲置了20分钟的无头chrome浏览器呢 请指导。我在

我正在使用“SeleniumJava.jar”文件打开chrome无头驱动程序。 现在,我们正在使用线程打开无头铬。现在,如果出现任何错误,线程会在不关闭浏览器的情况下退出

因此,我想实施一个解决方案,如果任何无头铬是理想的最后20分钟,然后关闭/退出它

我在谷歌上搜索了一下,找到了可能的解决方案,这是一个类似于selenium服务器的独立解决方案

我的问题是我现在无法切换到独立服务器,所以我必须用当前库找出解决方案

那么,有没有办法关闭所有闲置了20分钟的无头chrome浏览器呢


请指导。

我在TestNg中使用selenium-java.jar,虽然我不运行headless浏览器,但我会在TestNg aftermethod中的测试运行后进行清理,这与您等待20分钟的时间不太一样,但可能会有所帮助

在windows操作系统上运行测试时,我检查进程是否按名称运行并终止它:

public final class OsUtils
{
    private static final String TASKLIST = "tasklist";
    private static final String KILL = "taskkill /F /IM ";
    public static final String  IE_EXE = "iexplore.exe";
    public static final String  CHROME_EXE = "chrome.exe";
    public static final String  EDGE_EXE = "MicrosoftEdge.exe";
    public static final String  FIREFOX_EXE = "firefox.exe";


public static boolean isProcessRunning(String processName)
{
    Process process;
    try
    {
        process = Runtime.getRuntime().exec(TASKLIST);
    }
    catch (IOException ex)
    {
        Logger.error("Error on get runtime" + ex.getMessage());
        return false;
    }

    String line;
    try ( BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); )
    {
        while ((line = reader.readLine()) != null) {
            if (line.contains(processName)) {
                Logger.log("Process found");
                return true;
            }
        }
    }
    catch (IOException ex)
    {
        Logger.error("Error on check for process " + processName + ": " + ex.getMessage());
    }
    return false;
}

public static void killProcessIfRunning(String processName)
{
    Logger.log("Trying to kill process: " + processName);
    try
    {
        if (isProcessRunning(processName))
        {
            Runtime.getRuntime().exec(KILL + processName);
        }
    }
    catch (IOException ex)
    {
        Logger.error("Error on kill process " + processName+ ": " +  ex.getMessage());
    }
}
...
}
在macmini上运行Safari时,我有一个类似的kill命令(适用于Safari本身和技术预览):


自定义记录器类只使用
System.out.println(message)

您可能可以对符合驱动程序标准的不同进程的开始时间进行一些分析。我不认为它会告诉你它空闲了多长时间,但是你可以假设如果它已经运行了20分钟(假设你的测试应该在几分钟内成功完成),那么它可能是孤立的

我发现这显示了如何使用Java获取进程列表并查看它们的开始时间。从那里你应该能够找到所有的老司机,并杀死他们


另一种方法可能是使用Powershell获取进程、开始时间,并以这种方式进行处理。这取决于你在找什么。您可以将ChromeDriver子类化,并使用计时器实现自己的代理类,以便在20分钟空闲时间后退出:

public class TimedChromeDriver extends ChromeDriver {

  Timer timeOut;

  private void initTimer() {
    timeOut = new Timer();
  }

  private void startTimer() {
    timeOut.cancel();
    timeOut.schedule(
        new TimerTask() {
          @Override
          public void run() {
            quit();
          }
        },
        20 * 60 * 1000);
  }

  public TimedChromeDriver() {
    initTimer();
  }

  @Override
  public void get(String url) {
    super.get(url);
    startTimer();
  }

  // override every method of WebDriver and ChromeDriver in the same way
}
只有在触发计时器之前没有终止Java VM时,这才有效。垃圾收集器也可能会干扰。不推荐重写finalize方法


我会投入一些分析的努力在你不愉快地退出的线程上。这将从源头上解决您的问题。

这种方法将阻止并行运行脚本。是的,您下面的建议会有所帮助,或者1)在测试结束时拉一个进程ID查找列表,存储这些ID以及找到它们的时间,在运行之间保存数据,从而知道PID正在长时间运行。2) 甚至在浏览器启动前获取列表,在浏览器启动后更新列表,从而知道新的PID是要杀死的。仍然可以获取一个并行运行ID,但我们正在处理一个边缘案例,两个PID在20分钟后仍然启动,杀死了它们。OP可选择与您的建议一起进行调查。
public class TimedChromeDriver extends ChromeDriver {

  Timer timeOut;

  private void initTimer() {
    timeOut = new Timer();
  }

  private void startTimer() {
    timeOut.cancel();
    timeOut.schedule(
        new TimerTask() {
          @Override
          public void run() {
            quit();
          }
        },
        20 * 60 * 1000);
  }

  public TimedChromeDriver() {
    initTimer();
  }

  @Override
  public void get(String url) {
    super.get(url);
    startTimer();
  }

  // override every method of WebDriver and ChromeDriver in the same way
}