web-dev-qa-db-fra.com

Chromedriver ne supprime pas le répertoire * scoped dans le dossier temporaire une fois le test terminé

La dernière version de chromedriver.exe se heurtant à des problèmes d'espace disque insuffisant, car chromedriver ne supprime pas le dossier nommé scoped_ * à la fin de l'exécution. Il occupe près de 20 Go d'espace pour 400 tests. J'ai essayé avec les versions 2.28 et 2.29 de chromedriver. Je quitte le pilote correctement avec driver.close () et driver.Quit () aussi. Chrome est 57.

15
Karthi

J'ai réussi cela en ajoutant la suppression des dossiers temporaires qui commence par "scoped_dir" après avoir quitté le pilote comme:

 public static void teardown_()
        {
            // quit driver
            if (driver != null)
                driver.Quit();

            // delete all "scoped_dir" temp folders 
            string tempfolder = System.IO.Path.GetTempPath();
            string[] tempfiles = Directory.GetDirectories(tempfolder, "scoped_dir*", SearchOption.AllDirectories);
            foreach (string tempfile in tempfiles)
            {
                try
                {
                    System.IO.DirectoryInfo directory = new System.IO.DirectoryInfo(tempfolder);
                    foreach (System.IO.DirectoryInfo subDirectory in directory.GetDirectories()) subDirectory.Delete(true);
                }
                catch (Exception ex)
                {
                    writeEx("File '" + tempfile + "' could not be deleted:\r\n" +
                            "Exception: " + ex.Message + ".");
                }
            }
        } 

J'espère que cela aide!

10
Daniel Dumine

Il s'agit d'un bogue connu qui sera corrigé avec Chromedriver 2.30 https://bugs.chromium.org/p/chromedriver/issues/detail?id=644

Cela semble être une condition de concurrence entre ChromeDriver et Chrome. ChromeDriver crée ces répertoires temporaires pour une utilisation par Chrome et, à la fin, ChromeDriver essaie de supprimer ces répertoires. ChromeDriver attend que le processus principal Chrome se termine avant de procéder à la suppression, mais certains processus enfants Chrome peuvent encore être en cours d'exécution et s'accrocher à ces répertoires, provoquant la la suppression échoue. Actuellement, ChromeDriver ne réessaye pas la suppression.

La suppression des fichiers temporaires comme Daniel l'a mentionné peut être une solution temporaire mais je la supprimerais dès la sortie de Chromedriver 2.30.


Mise à jour

Chromedriver 2.30 est sorti et devrait résoudre ce problème.

9
cdzar

L'utilisation du dernier chromedriver 2.30.1 N'a pas résolu le problème pour moi - J'ai continué à manquer de stockage dans mon %TEMP% répertoire lors de l'exécution parallèle des travaux de sélénium .

La meilleure solution est de contrôler les userDataDir via options Chrome et de supprimer le répertoire vous-même après driver.quit()

Si votre processus est synchrone, la solution de @ cdzar ci-dessus fonctionnera, mais pour les travaux parallèles, vous devez vraiment contrôler le répertoire créer/supprimer vous-même.

Vous pouvez consultez d'autres commutateurs de ligne de commande de chrome ici .

3
SliverNinja - MSFT

a été signalé et corrigé. Commander 2.30 ou 2.31

UPD. fonctionne au moins pour notre réseau. Si vous avez encore des problèmes, il est préférable de signaler dans n'importe quel thread scope_dir sur productforums.google.com De plus, avant qu'il ne soit résolu, nous avons utilisé un script PS qui effaçait tous les fichiers dans .. *\AppData\Local\Temp

UPD. consultez le chrome navigateur a terminé le processus de mise à jour. Avec ce correctif, nous avons eu un problème que le navigateur conserve l'état "redémarrage requis pour que la mise à jour se termine" même après le redémarrage. C'est peut-être à la fois le navigateur et le pilote doivent être mis à jour pour que le correctif fonctionne - je ne peux pas dire avec certitude.

UPD2. Je vois que certaines personnes ont toujours le problème. (Peut-être l'ont-ils réédité?) Voici l'exemple d'un script PS qui était utilisé sur la machine Win au moment où nous avons eu le problème. Cleaner.ps1

#infinite loop for calling  function   
$ScriptPath = $MyInvocation.MyCommand.Definition

# 2030 year error
$timeout = new-timespan -end (get-date -year 2030 -month 1 -day 1)
$sw = [diagnostics.stopwatch]::StartNew()
while ($sw.elapsed -lt $timeout){
    if (-Not (test-path  $ScriptPath)){
        write-Host "v been renamed, quiting!"
        return
        }

    start-sleep -seconds 60
    # logic
$time=Get-Date
$maxdate = $time.AddMinutes(-120)
Get-WmiObject -Class Win32_UserProfile  | Foreach-Object {
    $path =  $_.LocalPath 
    if (-Not $path.Contains('Windows')){
    echo $path
    $Files = Get-ChildItem "$($path)\..\*\AppData\Local\Temp" -recurse | ?  {$_.LastWriteTime -lt $maxdate } |
     remove-item -force -recurse
    echo $Files 

    }
}   
}

run.bat

#PowerShell -Command "Set-ExecutionPolicy Unrestricted" >> "%TEMP%\StartupLog.txt" 2>&1 
PowerShell C:\path2CleanerFolder\Cleaner.ps1

GL

3
Konstantin Ivanov

Cette solution fonctionne sur Selenium 3.141.59. Avant de faire une driver.quit() dans votre méthode de démontage, utilisez driver.close(). Selenium WebDriver supprimera automatiquement les dossiers scoped_dir qu'il crée lors de l'exécution.

1
Cornel Dutta

Nous exécutons plusieurs ChromeDrivers à concurrence élevée, et j'ai obtenu une grande amélioration en utilisant l'idée de Cornel d'utiliser l'ajout d'une driver.close() avant la driver.quit() dans un test. Peut-être que cela donne Chrome un peu plus de temps pour arrêter ses processus avant la fermeture, empêchant une condition de course/verrouillage de se produire?

S'il s'avère que nous devons faire plus, j'essaierai de coder une réponse similaire à celle fournie par Daniel, mais en raison de notre niveau de concurrence, j'essaierai de supprimer les dossiers spécifiques créés par chaque instance de pilote.

Le nom du répertoire peut être obtenu de cette façon:

Capabilities caps = driver.getCapabilities();
Map<String, String> chromeReturnedCapsMap = (Map<String, String>) caps.getCapability("chrome");
LOG.debug("  Chrome Driver Temp Dir   : " + chromeReturnedCapsMap.get("userDataDir"));

Cela imprimera quelque chose comme
Dir. Temp du pilote Chrome: C:\Users\Metal666\AppData\Local\Temp\scoped_dir35344_14668

Cependant, il apparaît que deux répertoires sont créés - leur nom diffère après le dernier trait de soulignement. Ainsi, par exemple, les répertoires peuvent être nommés:

C:\Users\Metal666\AppData\Local\Temp\scoped_dir35344_14668 C:\Users\Metal666\AppData\Local\Temp\scoped_dir35344_28790

le code devrait donc prendre en charge la suppression des deux fichiers.

Testé avec Selenium 3.141.59, Chrome 74.0 .., ChromeDriver 74.0 ..

0
MetalRules