2
votes

Comment puis-je fermer tous les navigateurs Web inactifs ouverts par Selenium?

J'utilise le fichier "selenium-java.jar" pour ouvrir les pilotes sans tête de chrome. Maintenant, nous utilisons des threads pour ouvrir le chrome sans tête. Maintenant que se passe-t-il s'il y a une erreur, puis parfois les threads se ferment sans fermer le navigateur.

Je souhaite donc mettre en œuvre une solution qui, si un chrome sans tête est idéal pour les 20 dernières minutes, fermez-le / quittez-le.

J'ai cherché sur google et j'ai trouvé une solution qui concerne le serveur de sélénium autonome comme celle-ci https: //github.com/seleniumhq/selenium/issues/1106

Mon problème est que je ne peux pas passer au serveur autonome maintenant, je dois donc trouver une solution avec la bibliothèque actuelle.

Existe-t-il donc un moyen de fermer tous les navigateurs Chrome sans tête qui sont inactifs depuis 20 minutes?

Veuillez guider.


0 commentaires

3 Réponses :


2
votes

J'utilise selenium-java.jar avec TestNg et bien que je n'exécute pas de navigateurs headless, je nettoie après un test de la méthode après TestNg, ce qui n'est pas tout à fait le même que votre attente de 20 minutes, mais peut-être de aide.

Lors de l'exécution de tests sur un système d'exploitation Windows, je vérifie si le processus est en cours d'exécution par nom et je le termine:

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

Lors de l'exécution de Safari sur macmini, j'ai une commande kill similaire (qui fonctionne à la fois pour Safari proprement dit et aussi pour l'aperçu de la technologie):

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());
    }
}
...
}

La classe Logger personnalisée utilise simplement System.out.println (message)


2 commentaires

Cette approche va empêcher l'exécution de scripts en parallèle.


Oui, vos suggestions ci-dessous pourraient vous aider, ou 1) Extraire une liste d'ID de processus trouvés à la fin du test, stocker ceux avec l'heure à laquelle vous les avez trouvés, conserver les données entre les exécutions et ainsi savoir qu'un PID est long. 2) Ou même obtenir la liste avant le lancement du navigateur, mettre à jour la liste une fois le navigateur lancé et savoir ainsi que le nouveau PID est celui à tuer. Pourrait toujours récupérer un ID d'exécution parallèle, mais nous avons affaire à un cas de pointe ici, les deux PID toujours actifs après 20 minutes les tuent tous les deux. Option pour OP d'enquêter avec vos suggestions.



0
votes

Vous pouvez probablement faire une analyse sur l'heure de début des différents processus qui correspondent à vos critères de pilote. Je ne pense pas que cela vous dira depuis combien de temps il est resté inactif, mais vous pouvez probablement supposer que s'il fonctionne depuis 20 minutes (en supposant que votre test se termine avec succès en quelques minutes), il est probablement orphelin.

J'ai trouvé cette réponse qui montre comment vous pouvez utiliser Java pour obtenir une liste des processus et voir leur heure de début. À partir de là, vous devriez être en mesure de trouver tous les pilotes anciens et de les tuer.

Une alternative pourrait être d'utiliser Powershell pour obtenir les processus, l'heure de début et les gérer de cette manière. Cela dépend de ce que vous recherchez. Voici une réponse pour vous aider a commencé dans cette voie.


0 commentaires

0
votes

Vous pouvez sous-classer ChromeDriver et implémenter votre propre classe de proxy avec un minuteur pour quitter après 20 minutes d'inactivité:

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
}

Cela ne fonctionnera que si votre machine virtuelle Java n'est pas arrêtée avant que le minuteur ne soit déclenché. Le garbage collector pourrait également interférer. Le remplacement de la méthode de finalisation est obsolète.

J'investirais quelques efforts d'analyse pour que vos threads s'arrêtent sans grâce. Cela résoudrait vos problèmes à la source.


0 commentaires