由于chromedriver在执行结束时没有删除名为scoped_ *的文件夹,因此最新的chromedriver.exe会因磁盘空间问题而运行。它占用了近20 GB的空间用于400次测试。我尝试了2.28和2.29版本的chromedriver。我正在使用driver.close()和driver.Quit()正确退出驱动程序。 Chrome浏览器版本为57。
答案 0 :(得分:10)
我通过添加以" 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 + ".");
}
}
}
希望它有所帮助!
答案 1 :(得分:9)
这是一个已知的错误,将使用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发布后立即将其删除。
Chromedriver 2.30已经出局,应该解决这个问题。
答案 2 :(得分:3)
使用最新的 chromedriver 2.30.1
并没有为我解决问题 - 在运行并行 selenium时,我的%TEMP%
目录中的存储空间不足工作。
最佳解决方案是通过 Chrome选项控制userDataDir
并在driver.quit()
如果您的流程是同步的,那么@ cdzar上面的解决方案将起作用,但对于并行作业,您确实需要自己控制目录create / dispose。
答案 3 :(得分:3)
报告并修复。结帐2.30或2.31
UPD。至少适用于我们的网格。如果您仍有问题,最好报告到productforums.google.com上的任何scope_dir主题 另外在修复之前我们使用了PS脚本来清除.. * \ AppData \ Local \ Temp
中的所有文件UPD。看看Chrome浏览器已完成更新过程。除了这个修复,我们遇到了一个问题,即浏览器保持状态“重启需要重新启动”,即使重启后也是如此。这可能是浏览器和驱动程序都要更新以便修复工作 - 不能肯定地说。
UPD2。我看到有些人仍然有这个问题。 (也许他们重新发布了?) 这里是我们遇到问题时在Win机器上使用的PS脚本示例。 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
答案 4 :(得分:1)
此解决方案适用于Selenium 3.141.59。
在您的拆卸方法中执行driver.quit()
之前,请使用driver.close()
。 Selenium WebDriver将自动删除在执行过程中创建的scoped_dir文件夹。
答案 5 :(得分:0)
我们正在以高并发率运行多个ChromeDriver,并且利用Cornel的想法(在测试中将driver.close()
之前添加driver.quit()
的想法,我得到了很大的改进。也许它使Chrome在退出之前有更多时间关闭其进程,从而防止出现竞争/锁定情况?
如果事实证明我们需要做更多的事情,我将尝试编码与Daniel相似的答案,但是由于我们的并发程度,我将尝试删除每个驱动程序实例创建的特定文件夹。
可以通过以下方式获取目录名称:
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 ..进行了测试。