等待在 selenium 和 c# 中完成下载文件
Wait for finished download file in selenium and c#
我有一些问题。
单击 Web 应用程序上的图标后,我下载了一个文件。
我的下一步是在下载记录文件之前执行的。
我想等到文件下载完成?
有人知道怎么等吗?
也许看看这些:
How can I ask the Selenium-WebDriver to wait for few seconds in Java?
https://msdn.microsoft.com/en-us/library/system.threading.thread.sleep%28v=vs.110%29.aspx
我使用下面的脚本(文件名应该传入)。
第一部分等到文件出现在磁盘上(适合 chrome)
第二部分等到它停止变化(并开始有一些内容)
var downloadsPath = Environment.GetEnvironmentVariable("USERPROFILE") + @"\Downloads\" + fileName;
for (var i = 0; i < 30; i++)
{
if (File.Exists(downloadsPath)) { break; }
Thread.Sleep(1000);
}
var length = new FileInfo(downloadsPath).Length;
for (var i = 0; i < 30; i++)
{
Thread.Sleep(1000);
var newLength = new FileInfo(downloadsPath).Length;
if (newLength == length && length != 0) { break; }
length = newLength;
}
我从 Dmitry 的回答开始,添加了一些对控制超时和轮询间隔的支持。
这是解决方案:
/// <exception cref="TaskCanceledException" />
internal async Task WaitForFileToFinishChangingContentAsync(string filePath, int pollingIntervalMs, CancellationToken cancellationToken)
{
await WaitForFileToExistAsync(filePath, pollingIntervalMs, cancellationToken);
var fileSize = new FileInfo(filePath).Length;
while (true)
{
if (cancellationToken.IsCancellationRequested)
{
throw new TaskCanceledException();
}
await Task.Delay(pollingIntervalMs, cancellationToken);
var newFileSize = new FileInfo(filePath).Length;
if (newFileSize == fileSize)
{
break;
}
fileSize = newFileSize;
}
}
/// <exception cref="TaskCanceledException" />
internal async Task WaitForFileToExistAsync(string filePath, int pollingIntervalMs, CancellationToken cancellationToken)
{
while (true)
{
if (cancellationToken.IsCancellationRequested)
{
throw new TaskCanceledException();
}
if (File.Exists(filePath))
{
break;
}
await Task.Delay(pollingIntervalMs, cancellationToken);
}
}
然后你这样使用它:
using var cancellationTokenSource = new CancellationTokenSource(timeoutMs);
WaitForFileToFinishChangingContentAsync(filePath, pollingIntervalMs, cancellationToken);
取消操作将在指定超时后自动触发。
我有一些问题。 单击 Web 应用程序上的图标后,我下载了一个文件。 我的下一步是在下载记录文件之前执行的。 我想等到文件下载完成?
有人知道怎么等吗?
也许看看这些: How can I ask the Selenium-WebDriver to wait for few seconds in Java?
https://msdn.microsoft.com/en-us/library/system.threading.thread.sleep%28v=vs.110%29.aspx
我使用下面的脚本(文件名应该传入)。
第一部分等到文件出现在磁盘上(适合 chrome)
第二部分等到它停止变化(并开始有一些内容)
var downloadsPath = Environment.GetEnvironmentVariable("USERPROFILE") + @"\Downloads\" + fileName;
for (var i = 0; i < 30; i++)
{
if (File.Exists(downloadsPath)) { break; }
Thread.Sleep(1000);
}
var length = new FileInfo(downloadsPath).Length;
for (var i = 0; i < 30; i++)
{
Thread.Sleep(1000);
var newLength = new FileInfo(downloadsPath).Length;
if (newLength == length && length != 0) { break; }
length = newLength;
}
我从 Dmitry 的回答开始,添加了一些对控制超时和轮询间隔的支持。 这是解决方案:
/// <exception cref="TaskCanceledException" />
internal async Task WaitForFileToFinishChangingContentAsync(string filePath, int pollingIntervalMs, CancellationToken cancellationToken)
{
await WaitForFileToExistAsync(filePath, pollingIntervalMs, cancellationToken);
var fileSize = new FileInfo(filePath).Length;
while (true)
{
if (cancellationToken.IsCancellationRequested)
{
throw new TaskCanceledException();
}
await Task.Delay(pollingIntervalMs, cancellationToken);
var newFileSize = new FileInfo(filePath).Length;
if (newFileSize == fileSize)
{
break;
}
fileSize = newFileSize;
}
}
/// <exception cref="TaskCanceledException" />
internal async Task WaitForFileToExistAsync(string filePath, int pollingIntervalMs, CancellationToken cancellationToken)
{
while (true)
{
if (cancellationToken.IsCancellationRequested)
{
throw new TaskCanceledException();
}
if (File.Exists(filePath))
{
break;
}
await Task.Delay(pollingIntervalMs, cancellationToken);
}
}
然后你这样使用它:
using var cancellationTokenSource = new CancellationTokenSource(timeoutMs);
WaitForFileToFinishChangingContentAsync(filePath, pollingIntervalMs, cancellationToken);
取消操作将在指定超时后自动触发。