等待selenium和c#中的完成下载文件

时间:2015-02-18 14:56:31

标签: c# selenium wait

我有一些问题。 我在Web应用程序上单击图标后下载文件。 我的下一步比记录文件执行得更快。 我想要使​​用一些watit,但我知道怎么做?

有人知道怎么写等待吗?

3 个答案:

答案 0 :(得分:1)

我使用以下脚本(应传入 filename )。

第一部分等待文件出现在磁盘上(对于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;
}

答案 1 :(得分:1)

我从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);

在指定的超时时间后,取消操作将自动触发。

答案 2 :(得分:0)