2016-04-07 5 views
1

Ich möchte auf eine Schaltfläche klicken, die einen bestimmten Dateidownload auslöst und bestätigt, dass diese bestimmte Datei heruntergeladen wird.Testen, ob eine Datei heruntergeladen wurde Selenium/C# (Google Chrome)

Ich habe bereits gegoogelt, aber leider keine spezifische Antwort zu diesem Thema gefunden, und auch so ziemlich alle Beiträge, die ich gefunden habe, waren veraltet (2014), und Selenium wahrscheinlich verbessert einige der Funktionalitäten seit vor zwei Jahren.

Antwort

3

Verwenden Sie den folgenden Code: -

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; 
} 
} 

Hoffe, es wird Ihnen helfen :)

2

Dieser Code überprüft, ob Datei downloded und löscht sie anschließend.

private static bool CheckFileDownloaded(string filename) 
    { 
     bool exist = false; 
     string Path = System.Environment.GetEnvironmentVariable("USERPROFILE") + "\\Downloads"; 
     string[] filePaths = Directory.GetFiles(Path); 
     foreach (string p in filePaths) 
     { 
      if(p.Contains(filename)) 
      { 
       FileInfo thisFile = new FileInfo(p); 
       //Check the file that are downloaded in the last 3 minutes 
       if (thisFile.LastWriteTime.ToShortTimeString() == DateTime.Now.ToShortTimeString() || 
       thisFile.LastWriteTime.AddMinutes(1).ToShortTimeString() == DateTime.Now.ToShortTimeString() || 
       thisFile.LastWriteTime.AddMinutes(2).ToShortTimeString() == DateTime.Now.ToShortTimeString() || 
       thisFile.LastWriteTime.AddMinutes(3).ToShortTimeString() == DateTime.Now.ToShortTimeString()) 
       exist = true; 
       File.Delete(p); 
       break; 
      } 
     } 
     return exist; 
    } 

Hoffe, das hilft. Code in C#. Danke

1

Eine einfache Lösung wäre, einen Dateiwatcher zu verwenden, um die Erstellung der Datei zu erkennen. Es Ihnen erlauben würde, für den Download zu warten, um zu beginnen und zu beenden:

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)); 
} 
+0

Unfortunatelly Filesystemwatcher hat ein seltsames Verhalten und es ist sehr wahrscheinlich, dass es nicht gut in Ihren Selen-Tests synchronisieren wird. –

0

Das ist mein generische C# Lösung

/// <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; 
} 

Dies ist die Nutzung

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