Chromedriverはscoped_ *という名前のフォルダーを実行の最後に削除しないため、最新のchromedriver.exeでディスク領域が不足する問題が発生します。 400回のテストで約20 GBのスペースを占有しています。 2.28と2.29の両方のバージョンのchromedriverで試しました。 driver.close()とdriver.Quit()でも適切にドライバーを終了しています。 Chromeブラウザのバージョンは57です。
これを管理するには、次のようなドライバーを終了した後、「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 + ".");
}
}
}
それが役に立てば幸い!
これは既知のバグで、Chromedriver 2.30で修正されます https://bugs.chromium.org/p/chromedriver/issues/detail?id=644
これは、ChromeDriverとChrome間の競合状態のようです。 ChromeDriverは、Chromeが使用するこれらの一時ディレクトリを作成し、最後にChromeDriverはそれらのディレクトリを削除しようとします。 ChromeDriverは、メインのChrome=プロセスが削除を行う前に終了するのを待機しますが、一部のChrome=現在、ChromeDriverは削除を再試行しません。
ダニエルが述べたような一時ファイルを削除することは一時的な解決策ですが、Chromedriver 2.30がリリースされたらすぐに削除します。
Chromedriver 2.30がリリースされ、この問題は修正されるはずです。
最新のchromedriverを使用すると、2.30.1
は問題を解決しませんでした-並列実行中に%TEMP%
ディレクトリのストレージが不足し続けましたSeleniumジョブ。
最善の解決策は、 userDataDir
をChromeオプションで制御し、ディレクトリを自分で破棄することですdriver.quit()
プロセスが同期の場合、上記の@cdzarのソリューションは機能しませんが、並列ジョブの場合は、ディレクトリの作成/破棄を実際に制御する必要があります。
報告および修正されました。チェックアウト2.30または2.31
UPD。少なくともグリッドには機能します。それでも問題がある場合は、productforums.google.comのscope_dirスレッドに報告することをお勧めします。さらに、修正する前に、.. *\AppData\Local\TempのすべてのファイルをクリアするPSスクリプトを使用しました。
UPD。 chromeブラウザが更新プロセスを完了しました。この修正に伴い、ブラウザは再起動後も「更新を完了するには再起動が必要です」という状態を維持する問題がありました。動作を修正するために更新されます-確かに言うことはできません。
UPD2。まだ問題を抱えている人がいるようです。 (おそらく彼らはそれを再リリースしたのでしょうか?)ここに、問題が発生したときにWindowsマシンで使用されていた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
このソリューションは、Selenium 3.141.59で動作します。分解メソッドでdriver.quit()
を実行する前に、driver.close()
を使用します。 Selenium WebDriverは、実行中に作成したscoped_dirフォルダーを自動的に削除します。
複数のChromeDriverを高い同時実行性で実行しています。テストで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 Driver Temp Dir:C:\ Users\Metal666\AppData\Local\Temp\scoped_dir35344_14668
ただし、twoディレクトリが作成されたように見えます-最後にアンダースコアを付けた後、名前が異なります。したがって、たとえば、ディレクトリの名前は次のようになります。
C:\ Users\Metal666\AppData\Local\Temp\scoped_dir35344_14668C:\ Users\Metal666\AppData\Local\Temp\scoped_dir35344_28790
そのため、コードは両方のファイルを削除する必要があります。
Selenium 3.141.59、Chrome 74.0 ..、ChromeDriver 74.0 ..を使用してテスト済み.