测试文件是否已下载Selenium / C#(谷歌浏览器)

时间:2016-04-07 07:00:20

标签: c# selenium

我想点击一个会触发特定文件下载的按钮,并确认正在下载此特定文件。

我已经用谷歌搜索了这个,但遗憾的是没有找到关于这个主题的具体答案,而且我发现的几乎所有帖子都已经过时(2014),而Selenium可能改进了一些功能两年前。

5 个答案:

答案 0 :(得分:4)

使用以下代码: -

import org.openqa.selenium.By;
import java.io.File;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.firefox.FirefoxProfile;
import org.testng.Assert;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;

public class FileDownloadVerify {

 private WebDriver driver;

 private static String downloadPath = "D:\\siva";
 private String URL="http://all-free-download.com/free-photos/download/in_love_cosmos_flower_garden_220378.html";

 @BeforeClass
 public void testSetup() throws Exception{
  driver = new FirefoxDriver(firefoxProfile()); 
  driver.manage().window().maximize();
 }

  @Test
 public void example_VerifyExpectedFileName() throws Exception {
  driver.get(URL);
     driver.findElement(By.xpath(".//*[@id='detail_content']/div[2]/a")).click();

     Thread.sleep(10000);
     File getLatestFile = getLatestFilefromDir(downloadPath);
     String fileName = getLatestFile.getName();
     Assert.assertTrue(fileName.equals("in_love_cosmos_flower_garden_220378.zip"), "Downloaded file name is not matching with expected file name");
 }


 @AfterClass
 public void tearDown() {
  driver.quit();
 }
public static FirefoxProfile firefoxProfile() throws Exception {

  FirefoxProfile firefoxProfile = new FirefoxProfile();
  firefoxProfile.setPreference("browser.download.folderList",2);
  firefoxProfile.setPreference("browser.download.manager.showWhenStarting",false);
  firefoxProfile.setPreference("browser.download.dir",downloadPath);
  firefoxProfile.setPreference("browser.helperApps.neverAsk.saveToDisk","application/zip");

  return firefoxProfile;
 }
public boolean isFileDownloaded(String downloadPath, String fileName) {
 boolean flag = false;
    File dir = new File(downloadPath);
    File[] dir_contents = dir.listFiles();

    for (int i = 0; i < dir_contents.length; i++) {
        if (dir_contents[i].getName().equals(fileName))
            return flag=true;
            }

    return flag;
}

private boolean isFileDownloaded_Ext(String dirPath, String ext){
 boolean flag=false;
    File dir = new File(dirPath);
    File[] files = dir.listFiles();
    if (files == null || files.length == 0) {
        flag = false;
    }

    for (int i = 1; i < files.length; i++) {
     if(files[i].getName().contains(ext)) {
      flag=true;
     }
    }
    return flag;
}

private File getLatestFilefromDir(String dirPath){
    File dir = new File(dirPath);
    File[] files = dir.listFiles();
    if (files == null || files.length == 0) {
        return null;
    }

    File lastModifiedFile = files[0];
    for (int i = 1; i < files.length; i++) {
       if (lastModifiedFile.lastModified() < files[i].lastModified()) {
           lastModifiedFile = files[i];
       }
    }
    return lastModifiedFile;
}
}

希望它会对你有所帮助:)。

答案 1 :(得分:4)

此代码验证文件是否已下载,然后将其删除。

<script>    AdobeEdge.loadComposition('test', 'EDGE-102396420', {
    scaleToFit: "none",
    centerStage: "none",
    minW: "0px",
    maxW: "undefined",
    width: "300px",
    height: "250px" }, {"dom":{}}, {"dom":{}}); 
</script>

希望这会有所帮助。 C#中的代码。感谢

答案 2 :(得分:2)

一个简单的解决方案是使用文件监视器来检测文件的创建。 它允许您等待下载开始并完成:

string folder = Environment.GetEnvironmentVariable("USERPROFILE") + "\\Downloads";
using (var watcher = new FileSystemWatcher(folder)) {

    // wait for new file to be created
    var result = watcher.WaitForChanged(WatcherChangeTypes.Created, 5000);
    if (result.TimedOut)
        throw new WebDriverTimeoutException("Dowmload failed");
    Console.WriteLine("Download started for : " + Path.Combine(folder, result.Name));

    // wait for the temporary file to be deleted
    var result2 = watcher.WaitForChanged(WatcherChangeTypes.Deleted, 10000);
    if (result2.TimedOut)
        throw new WebDriverTimeoutException("Dowmload failed");
    Console.WriteLine("Download finished for : " + Path.Combine(folder, result.Name));
}

答案 3 :(得分:1)

这是我的通用C#解决方案

/// <summary>
/// Start a download and wait for a file to appear
/// https://stackoverflow.com/a/46440261/1141876
/// </summary>
/// <param name="expectedExtension">If we don't know the extension, Chrome creates a temp file in download folder and we think we have the file already</param>
protected List<FileInfo> ActAndWaitForFileDownload(
    Action action
    , string expectedExtension
    , TimeSpan maximumWaitTime)
{
    Directory.CreateDirectory(DownloadDirectory);
    var fileCountbefore = Directory.GetFiles(DownloadDirectory).Length;
    var stopwatch = Stopwatch.StartNew();

    action();

    var isTimedOut = false;
    var extensionFilter = $"*{expectedExtension}";

    Func<bool> fileAppearedOrTimedOut = () =>
    {
        isTimedOut = stopwatch.Elapsed > maximumWaitTime;
        var isFilePresent = Directory
                                .GetFiles(DownloadDirectory, extensionFilter)
                                .Length == fileCountbefore;

        return isFilePresent && !isTimedOut;
    };

    do
    {
        Thread.Sleep(500);
        Log($"Waited {stopwatch.Elapsed} (max={maximumWaitTime}) for download '{extensionFilter}'...");
    }
    while (fileAppearedOrTimedOut());

    var files = Directory
                    .GetFiles(DownloadDirectory)
                    .Select(s => new FileInfo(s))
                    .ToList();

    if (isTimedOut)
    {
        Log($"Timed out: {filenamesForLog}");
    }
    else
    {
        var filenamesForLog = string.Join(",", files.Select(f => f.Name));
        Log($"File downloaded: {filenamesForLog}");
    }

    return files;
}

这是用法

// Wait for a PDF
var downloadedFiles = ActAndWaitForFileDownload(() => buttonElement.click(), ".pdf", TimeSpan.FromSeconds(30));

答案 4 :(得分:0)

FWR,我尝试过的两个测试运行程序(Resharper和MS Test Explorer)都将Selenium文件放在以下文件夹中。

MySolution\MyProject\bin\Debug\Downloads

实际上,Se在此处添加了readme.txt,其中包含:

  

Selenium在此文件夹中下载文件

但是,我能够相应地修改@Sudeepthi的答案:

private static readonly string SeleniumDownloadPath = 
     AppDomain.CurrentDomain.BaseDirectory + "\\Downloads";
private static bool CheckFileDownloaded(string filename)
{
    var firstFile = Directory
        .GetFiles(SeleniumDownloadPath)
        .FirstOrDefault(fp => fp.Contains(filename));
    if (firstFile != default)
    {
        var fileInfo = new FileInfo(firstFile);
        var isFresh = DateTime.Now - fileInfo.LastWriteTime < TimeSpan.FromMinutes(3);
        File.Delete(firstFile);
        //Check the file that are downloaded in the last 3 minutes
        return isFresh;
    }
    return false;
}