【问题标题】:Chromedriver not deleting scoped* dir in temp folder after test is complete测试完成后,Chromedriver 未删除临时文件夹中的作用域 * 目录
【发布时间】:2017-04-08 00:52:19
【问题描述】:

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

【问题讨论】:

    标签: selenium selenium-webdriver selenium-chromedriver


    【解决方案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 + ".");
                    }
                }
            } 
    

    希望对你有帮助!

    【讨论】:

    • 如果你得到“不能删除非空文件夹”,使用这个实现: foreach (string tempFolder in tempFolders) { try { Directory.Delete(tempFolder, true); } 捕捉(异常前){ ... } }
    • 此策略适用于同步执行,但如果您使用并行 chromedriver 作业,您将踩踏正在运行的 chromedriver.exe 进程并导致问题。
    【解决方案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 发布后立即将其删除。


    更新

    Chromedriver 2.30 已经发布,应该可以解决这个问题。

    更新 2

    看来您的里程可能会因此而有所不同。该版本的发行说明将此列为当天已解决的问题,但有些人仍然看到该问题。在这一点上,这个版本也非常旧 - 所以虽然这个答案在发布时是相关的,但应该使用 Chromedriver 的较新版本。

    【讨论】:

    • 使用最新的驱动程序验证问题仍然存在...在使用 WebdriverJS 完成繁重的硒工作并用完磁盘空间后,我得到了这个问题。仍然使用 chromedriver 2.30.1 看到 %TEMP% 中卡住的 scoped_dirXXXX 目录。必须按照上面发布的手动清理路线...只需创建 5-6k 驱动程序,您也会看到 ;-)
    • 我承认我没有使用 2.30 补丁说明,该补丁说明说问题已得到解决。你从哪里得到2.30.1?我还没有看到任何地方提到该版本已经发布。
    • 2020 和 84 版在这里,它正在发生。
    【解决方案3】:

    使用最新的 chromedriver 2.30.1 并没有解决我的问题 - 在运行并行 selenium 作业时,我的 %TEMP% 目录中的存储空间一直不足。

    最好的解决办法是通过Chrome选项控制userDataDir,在driver.quit()之后自己处理目录

    如果您的进程是同步的,那么上述@c​​dzar 的解决方案将起作用,但对于并行作业,您确实需要自己控制目录创建/处置。

    您可以checkout other chromium command line switches here

    【讨论】:

    • 我使用的是 ChromeDrive 2.34 和 Chrome 版本 64。我仍然遇到这个问题,我可以报告说,如此快地用本质上的垃圾填充硬盘非常烦人。
    【解决方案4】:

    已报告并修复。结帐 2.30 或 2.31

    UPD。至少适用于我们的网格。如果您仍有问题,最好在 productforums.google.com 上的任何 scope_dir 线程中报告 此外,在修复之前,我们使用 PS 脚本清除 ..*\AppData\Local\Temp 中的所有文件

    UPD。检查 chrome 浏览器是否已完成更新过程。除了此修复,我们还遇到了一个问题,即即使在重新启动后,浏览器仍会保持“更新完成需要重新启动”状态。可能浏览器和驱动程序都需要更新才能修复 - 不能确定。

    UPD2。我看到有些人仍然有这个问题。 (也许他们重新发布了它?) 这是我们遇到问题时在 Win 机器上使用的 PS 脚本示例。 清洁工.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 
    
        }
    }   
    }
    

    运行.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】:

        我们以高并发运行多个 ChromeDriver,使用 Cornel 的想法,即在测试中在 driver.quit() 之前添加 driver.close(),我得到了很大的改进。也许它让 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 Driver Temp Dir : 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..进行测试

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-02
          • 2011-04-20
          • 2018-01-25
          • 1970-01-01
          相关资源
          最近更新 更多