Chromedriver не удаляет область видимости * dir в папке temp после завершения теста

С последними проблемами chromedriver.exe, возникающими из-за проблем с дисковым пространством, поскольку chromedriver не удаляет папку с именем scoped_ * в конце выполнения. Он занимает почти 20 ГБ пространства для 400 тестов. Я пробовал с версиями хромографа 2.28 и 2.29. Я правильно выхожу из драйвера с драйверами. Close() и driver.Quit(). Версия браузера Chrome - 57.

Ответ 1

Мне это удалось, добавив удаление временных папок, начинающихся с "scoped_dir" после выхода из драйвера, например:

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

Надеюсь, что это поможет!

Ответ 2

Это известная ошибка, которая будет исправлена ​​с помощью Chromedriver 2.30 https://bugs.chromium.org/p/chromedriver/issues/detail?id=644

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

Удаление временных файлов, таких как Daniel, может быть временным решением, но я удалю его, как только Chromedriver 2.30 будет выпущен.


Update

Chromedriver 2.30 вышел и должен исправить эту проблему.

Ответ 3

Использование последней хромированной решетки 2.30.1 не помогло мне решить проблему - у меня закончилось сохранение в моем каталоге %TEMP% при выполнении параллельных заданий selenium.

Лучшим решением является управление userDataDir через Параметры Chrome и удалять каталог самостоятельно после вы driver.quit()

Если ваш процесс синхронный, чем решение @cdzar выше, будет работать, но для параллельных заданий вам действительно нужно управлять каталогом create/dispose.

Вы можете проверить другие ключи командной строки chrome здесь.

Ответ 4

было сообщено и исправлено. Оформить заказ 2.30 или 2.31

UPD. по крайней мере, работает для нашей сетки. Если у вас все еще есть проблемы, лучше сообщить о них в любой ветке scope_dir на productforums.google.com. Кроме того, перед его исправлением мы использовали скрипт PS, который очищал все файлы в.. *\AppData\Local\Temp

UPD. проверьте, что браузер chrome завершил процесс обновления. Наряду с этим исправлением у нас была проблема, заключающаяся в том, что браузер сохраняет состояние "требуется перезагрузка для завершения обновления" даже после перезагрузки. Может быть, и браузер и драйвер должны быть обновлены для исправления work-, не могу сказать наверняка.

UPD2. Я вижу, что у некоторых людей все еще есть проблема. (может быть, они переиздали его?) Вот пример сценария PS, который использовался на машине Win в то время, когда у нас была проблема. 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

Ответ 5

Это решение работает на Selenium 3.141.59. Перед выполнением driver.quit() в вашем методе разрыва, используйте driver.close(). Selenium WebDriver автоматически удалит папки scoped_dir, которые он создает во время выполнения.

Ответ 6

Мы запускаем несколько ChromeDrivers с высокой степенью параллелизма, и я получил значительное улучшение, используя идею Cornel, driver.close() добавлении driver.close() перед driver.quit() в тесте. Может быть, это дает Chrome немного больше времени, чтобы завершить свои процессы перед выходом, предотвращая возникновение состояния гонки/блокировки?

Если окажется, что нам нужно сделать больше, я постараюсь кодировать ответ, аналогичный тому, который предоставил Дэниел, но из-за нашего уровня параллелизма я попытаюсь удалить определенные папки, созданные каждым экземпляром драйвера.

Имя каталога можно получить следующим образом:

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

Это напечатает что-то вроде
Каталог драйверов Chrome: C:\Users\Metal666\AppData\Local\Temp\scoped_dir35344_14668

Однако создается впечатление, что созданы два каталога - они отличаются по имени после того, как будут подчеркнуты последними. Так, например, каталоги могут быть названы:

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

поэтому код должен был бы обслуживать удаление обоих файлов.

Протестировано с использованием Selenium 3.141.59, Chrome 74.0.., ChromeDriver 74.0..