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