selenium 校验文件下载成功

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了selenium 校验文件下载成功相关的知识,希望对你有一定的参考价值。

转自: http://www.seleniumeasy.com/selenium-tutorials/verify-file-after-downloading-using-webdriver-java

 

It is very important to verify if the file is downloaded successful or not. Most of the cases we just concentrate on clicking the downloaded button. But at the same time it is also very important to confirm that file is downloaded successfully without any errors or if some other file is getting downloaded.

In most of the cases we know which file is getting downloaded after clicking on download button / link. Now when we know the file name, we can verify using java for the ‘File Exists‘ in a downloaded folder location which we specify.

Even there are cases where file name is not unique. File name may be generated dynamically. In such cases we can also check for the file exists with the file extension.

We will see all the above cases and verify for the file which is being downloaded. We will see examples using Java File IO and WatchService API

技术分享图片
package com.pack;

import java.io.File;
import java.io.FileFilter;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;

import org.apache.commons.io.comparator.LastModifiedFileComparator;
import org.apache.commons.io.filefilter.WildcardFileFilter;
import org.openqa.selenium.By;
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:\\seleniumdownloads";
    private String URL="http://spreadsheetpage.com/index.php/file/C35/P10/"; 
    
    @BeforeClass
    public void testSetup() throws Exception{
        driver = new FirefoxDriver(firefoxProfile());    
        driver.manage().window().maximize();
    }
    
    @Test
    public void example_VerifyDownloadWithFileName()  {
        driver.get(URL);
        driver.findElement(By.linkText("mailmerge.xls")).click();
        Assert.assertTrue(isFileDownloaded(downloadPath, "mailmerge.xls"), "Failed to download Expected document");
    }
    
        @Test
    public void example_VerifyDownloadWithFileExtension()  {
        driver.get(URL);
        driver.findElement(By.linkText("mailmerge.xls")).click();
        Assert.assertTrue(isFileDownloaded_Ext(downloadPath, ".xls"), "Failed to download document which has extension .xls");
    }

    @Test
    public void example_VerifyExpectedFileName() {
        driver.get(URL);
        driver.findElement(By.linkText("mailmerge.xls")).click();
        File getLatestFile = getLatestFilefromDir(downloadPath);
        String fileName = getLatestFile.getName();
        Assert.assertTrue(fileName.equals("mailmerge.xls"), "Downloaded file name is not matching with expected file name");
    }
    

    @AfterClass
    public void tearDown() {
        driver.quit();
    }
View Code

 

Here we are defining the preferences to the Firefox browser and we will pass this to the Webdriver. We can set different preferences based on the requirement. In this tutorial there are many other preferences which are used when downloading a file using Firefox Preferences.

技术分享图片
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",
"text/csv,application/x-msexcel,application/excel,application/x-excel,application/vnd.ms-excel,image/png,image/jpeg,text/html,text/plain,application/msword,application/xml");
        
        return firefoxProfile;
    }
View Code

 

Below method takes the download directory and the file name, which will check for the file name mention in the directory and will return ‘True‘ if the document is available in the folder else ‘false‘. When we are sure of the file name, we can make use of this method to verify.

技术分享图片
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;
    }
View Code

 

The below method takes two parameters, first takes the folder path and the file extension / mime type. it will return true if the file with the specific extension is available in the specified folder.

技术分享图片
/* Check the file from a specific directory with extension */
    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;
    }
View Code

 

The below method is used to get the document name based on the last action performed in the specified folder. This is done by using java LastModifiedwhich returns a long value representing the time the file was last modified.

技术分享图片
/* Get the latest file from a specific directory*/
    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;
    }
    
View Code

 

When ever we click on download, based on the file size and network we need to wait for specific to complete download operation. If not we may encounter issues as the file is not downloaded.

We can also make use of ‘Java Watch Service API‘ which monitors the changes in the directory. Note: This is compatible with Java 7 version. Below is the example program using Watch Service API. And here we will user only for ‘ENTRY_CREATE‘ event.

技术分享图片
public static String getDownloadedDocumentName(String downloadDir, String fileExtension)
    {    
        String downloadedFileName = null;
        boolean valid = true;
        boolean found = false;
    
        //default timeout in seconds
        long timeOut = 20; 
        try 
        {                    
            Path downloadFolderPath = Paths.get(downloadDir);
            WatchService watchService = FileSystems.getDefault().newWatchService();
            downloadFolderPath.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
            long startTime = System.currentTimeMillis();
            do 
            {
                WatchKey watchKey;
                watchKey = watchService.poll(timeOut,TimeUnit.SECONDS);
                long currentTime = (System.currentTimeMillis()-startTime)/1000;
                if(currentTime>timeOut)
                {
                    System.out.println("Download operation timed out.. Expected file was not downloaded");
                    return downloadedFileName;
                }
                
                for (WatchEvent> event : watchKey.pollEvents())
                {
                     WatchEvent.Kind> kind = event.kind();
                    if (kind.equals(StandardWatchEventKinds.ENTRY_CREATE)) 
                    {
                        String fileName = event.context().toString();
                        System.out.println("New File Created:" + fileName);
                        if(fileName.endsWith(fileExtension))
                        {
                            downloadedFileName = fileName;
                            System.out.println("Downloaded file found with extension " + fileExtension + ". File name is " + 

fileName);
                            Thread.sleep(500);
                            found = true;
                            break;
                        }
                    }
                }
                if(found)
                {
                    return downloadedFileName;
                }
                else
                {
                    currentTime = (System.currentTimeMillis()-startTime)/1000;
                    if(currentTime>timeOut)
                    {
                        System.out.println("Failed to download expected file");
                        return downloadedFileName;
                    }
                    valid = watchKey.reset();
                }
            } while (valid);
        } 
        
        catch (InterruptedException e) 
        {
            System.out.println("Interrupted error - " + e.getMessage());
            e.printStackTrace();
        }
        catch (NullPointerException e) 
        {
            System.out.println("Download operation timed out.. Expected file was not downloaded");
        }
        catch (Exception e)
        {
            System.out.println("Error occured - " + e.getMessage());
            e.printStackTrace();
        }
        return downloadedFileName;
    }
View Code

 

以上是关于selenium 校验文件下载成功的主要内容,如果未能解决你的问题,请参考以下文章

Selenium常用的三种等待方式

Selenium Xpath元素无法定位 NoSuchElementException: Message: no such element: Unable to locate element(代码片段

python selenium片段+网络驱动程序

Selenium JavascriptExecutor 详解

Selenium JavascriptExecutor 详解

有没有办法关闭代码片段中的命名建议?