Chromedriver在测试完成后不删除临时文件夹中的作用域*目录

时间:2017-04-08 00:52:20

标签: selenium selenium-webdriver selenium-chromedriver

由于chromedriver在执行结束时没有删除名为scoped_ *的文件夹,因此最新的chromedriver.exe会因磁盘空间问题而运行。它占用了近20 GB的空间用于400次测试。我尝试了2.28和2.29版本的chromedriver。我正在使用driver.close()和driver.Quit()正确退出驱动程序。 Chrome浏览器版本为57。

6 个答案:

答案 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。

你可以checkout other chromium command line switches here

答案 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 ..进行了测试。