Как закрыть все неиспользуемые веб-браузеры, открытые селеном? - PullRequest
0 голосов
/ 31 января 2019

Я использую файл "selenium-java.jar", чтобы открыть chrome headless драйверы.Теперь мы используем темы, чтобы открыть безголовый хром.Теперь, что произойдет, если возникнет какая-либо ошибка, когда-нибудь потоки закроются, не закрывая браузер.

Так что я хочу реализовать решение, которое, если какой-либо хром без головы идеален в течение последних 20 минут, затем закройте / выйдите из него.

Я искал в Google и обнаружил, что может быть решение, которое касается автономного сервера селеном, например: https://github.com/seleniumhq/selenium/issues/1106

Моя проблема в том, что я не могу сейчас перейти на автономный сервер, поэтому мне нужно найти решение с текущей библиотекой.

Так есть ли способ закрыть все браузеры Chrome без головы, которые простаивают в течение последних 20 минут?

Пожалуйста, руководство.

Ответы [ 3 ]

0 голосов
/ 31 января 2019

Возможно, вы сможете провести анализ времени запуска различных процессов, которые соответствуют критериям вашего драйвера.Я не думаю, что он скажет вам, как долго он простаивал, но вы, вероятно, можете предположить, что, если он работал в течение 20 минут (при условии, что ваш тест успешно завершится в течение нескольких минут), он, вероятно, осиротел.

Я нашел этот ответ , который показывает, как вы можете использовать Java, чтобы получить список процессов и увидеть время их запуска.Оттуда вы сможете найти все старые драйверы и убить их.

Альтернативой может быть использование Powershell для получения процессов, времени запуска и работы с ними таким образом.Это зависит только от того, что вы ищете. Вот ответ , чтобы вы пошли по этому пути.

0 голосов
/ 02 февраля 2019

Вы можете создать подкласс 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 не была прервана до запуска таймера.Сборщик мусора также может помешать.Переопределение метода finalize устарело.

Я бы потратил немного усилий на анализ, чтобы ваши нити вышли изящно.Это решит ваши проблемы у источника.

0 голосов
/ 31 января 2019

Я использую selenium-java.jar с TestNg, и, хотя я не запускаю браузеры без монитора, я выполняю очистку после тестового прогона в методе TestNg, который не совсем совпадает с вашим 20-минутным ожиданием, но может иметьhelp.

При запуске тестов в ОС 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());
    }
}
...
}

При запуске Safari в Macmini происходит аналогичное уничтожение.команда (которая работает как для самого Safari, так и для предварительного просмотра технологии):

public static void killSafariProcess()
{
    Logger.log("Trying to kill Safari processes if running.");

    try
    {
        Process p = Runtime.getRuntime().exec(new String[]{"bash","-c","ps ux | grep -i app/Contents/MacOs/Safari | grep -v grep | awk '{print $2}' | xargs kill -9"});
    }
    catch (IOException ex)
    {
        Logger.error("Error on kill Safari processes: " +  ex.getMessage());
    }
}

Пользовательский класс Logger просто использует System.out.println(message)

...