---
title: Testing File Download with Selenium
description: Learn how to test file downloads with Selenium WebDriver.
source_url:
  html: https://testingbot.com/support/web-automate/selenium/test-file-downloads
  md: https://testingbot.com/support/web-automate/selenium/test-file-downloads.md
---

# Test File Downloads

TestingBot provides custom Selenium WebDriver commands to verify if a file was downloaded during a test automation session.   
 Below you'll find examples on how to:

- [Download files on remote desktop instances during your test](https://testingbot.com#download)
- [Verify that the file was downloaded successfully](https://testingbot.com#verify)
- [Retrieve (meta) properties from the downloaded file](https://testingbot.com#retrieve)
- [Retrieve the contents of the downloaded file](https://testingbot.com#contents)

All functions below can be used with a `fileName` argument, or without an argument.   
 If you do not specify a specific filename, TestingBot will automatically select the most recent downloaded file.

## Download files on remote desktop instances during your test

As part of your test automation flow, you might want to test download functionality of your webapp.   
 In the example below, we'll first show you how to instruct the remote TestingBot browser to download a file on the TestingBot virtual machine.

[Java](https://testingbot.com#) [Python](https://testingbot.com#) [NodeJS](https://testingbot.com#) [Ruby](https://testingbot.com#) [PHP](https://testingbot.com#) [C#](https://testingbot.com#)

```java
ChromeOptions options = new ChromeOptions();
options.setPlatformName("WIN11");
options.setBrowserVersion("latest");

HashMap<String, Object> tbOptions = new HashMap<>();
tbOptions.put("key", "API_KEY");
tbOptions.put("secret", "API_SECRET");
tbOptions.put("name", "My First Download Test");
options.setCapability("tb:options", tbOptions);

WebDriver driver = new RemoteWebDriver(new URL("https://hub.testingbot.com/wd/hub"), options);
driver.get("https://testingbot.com/security");

driver.findElement(By.cssSelector("body > div.bigHeader.enterprise > div.hero.enterprise.feature > div > div > div > a")).click();

Thread.sleep(1000);
driver.quit();
```

```python
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options

options = Options()
options.browser_version = 'latest'
options.platform_name = 'WIN11'
options.set_capability('tb:options', {
  'key': 'API_KEY',
  'secret': 'API_SECRET',
  'name': 'My First Download Test'
})

driver = webdriver.Remote(
  command_executor='https://hub.testingbot.com/wd/hub',
  options=options
)
driver.get("https://testingbot.com/security")

driver.find_element(By.CSS_SELECTOR, "body > div.bigHeader.enterprise > div.hero.enterprise.feature > div > div > div > a").click()
time.sleep(2)

driver.quit()
```

```javascript
const { Builder, By } = require('selenium-webdriver');
const chrome = require('selenium-webdriver/chrome');
const fs = require('fs');

async function main() {
  let options = new chrome.Options();
  options.setBrowserVersion('latest');
  options.setPlatformName('WIN11');
  options.set('tb:options', {
    'key': 'API_KEY',
    'secret': 'API_SECRET',
    'name': 'My First Download Test'
  });

  let driver = await new Builder()
    .usingServer('https://hub.testingbot.com/wd/hub')
    .setChromeOptions(options)
    .build();

  await driver.get('https://testingbot.com/security');
  await driver.findElement(By.css("body > div.bigHeader.enterprise > div.hero.enterprise.feature > div > div > div > a")).click();
  await driver.sleep(2000);
  await driver.quit();
}
main();
```

```ruby
#!/usr/bin/env ruby

require 'rubygems'
require 'selenium-webdriver'

options = Selenium::WebDriver::Chrome::Options.new
options.browser_version = 'latest'
options.platform_name = 'WIN11'
options.add_option('tb:options', {
  'key' => 'API_KEY',
  'secret' => 'API_SECRET',
  'name' => 'My First Download Test'
})

driver = Selenium::WebDriver.for(
  :remote,
  url: 'https://hub.testingbot.com/wd/hub',
  options: options
)
driver.navigate.to 'https://testingbot.com/security'

# click the download button
element = driver.find_element(:css, 'body > div.bigHeader.enterprise > div.hero.enterprise.feature > div > div > div > a')
element.click
sleep 6
driver.quit
```

```php
require_once('vendor/autoload.php');
use Facebook\WebDriver\Remote\RemoteWebDriver;
use Facebook\WebDriver\Remote\DesiredCapabilities;
use Facebook\WebDriver\Chrome\ChromeOptions;
use Facebook\WebDriver\WebDriverBy;

$options = new ChromeOptions();
$capabilities = DesiredCapabilities::chrome();
$capabilities->setCapability(ChromeOptions::CAPABILITY, $options);
$capabilities->setCapability('browserVersion', 'latest');
$capabilities->setCapability('platformName', 'WIN11');
$capabilities->setCapability('tb:options', [
  'key' => 'API_KEY',
  'secret' => 'API_SECRET',
  'name' => 'My First Download Test'
]);

$web_driver = RemoteWebDriver::create(
  'https://hub.testingbot.com/wd/hub',
  $capabilities
);
$web_driver->get('https://testingbot.com/security');
$web_driver->findElement(WebDriverBy::cssSelector('body > div.bigHeader.enterprise > div.hero.enterprise.feature > div > div > div > a'))->click();
$web_driver->quit();
```

```csharp
using System;
using System.Collections.Generic;
using OpenQA.Selenium;
using OpenQA.Selenium.Remote;
using OpenQA.Selenium.Chrome;
using System.IO;
using System.Threading;

namespace SeleniumTest {
    class FileDownload {
        static void Main(string[] args) {
            ChromeOptions options = new ChromeOptions();
            options.BrowserVersion = "latest";
            options.PlatformName = "WIN11";
            options.AddAdditionalOption("tb:options", new Dictionary<string, object>
            {
                ["key"] = "API_KEY",
                ["secret"] = "API_SECRET",
                ["name"] = "My First Download Test"
            });

            IWebDriver driver = new RemoteWebDriver(
                new Uri("https://hub.testingbot.com/wd/hub"), options
            );
            driver.Navigate().GoToUrl("https://testingbot.com/security");

            driver.FindElement(By.CssSelector("body > div.bigHeader.enterprise > div.hero.enterprise.feature > div > div > div > a")).Click();
            Thread.Sleep(2000);
            driver.Quit();
        }
    }
}
```

## Verify that the file was downloaded successfully

Once you've downloaded a file during your test automation, you might want to check if it was downloaded correctly (does it exist on the disk?).   
 To perform this check, TestingBot has created a custom `tb:fileExists` command which can be used with the JavascriptExecutor provided by Selenium WebDriver.

[Java](https://testingbot.com#) [Python](https://testingbot.com#) [NodeJS](https://testingbot.com#) [Ruby](https://testingbot.com#) [PHP](https://testingbot.com#) [C#](https://testingbot.com#)

```java
Map<String, Object> fileMap = new HashMap<>();
fileMap.put("fileName", "...the file name...");
((JavascriptExecutor) driver).executeScript("tb:fileExists", fileMap);
```

```python
driver.execute_script("tb:fileExists", {
  "fileName": "...the file name..."
})
```

```javascript
await driver.executeScript('tb:fileExists', {
  "fileName": "...the file name..."
});
```

```ruby
driver.execute_script('tb:fileExists', {
  'fileName' => '...the file name...'
})
```

```php
$driver->executeScript('tb:fileExists', [
  'fileName' => '...the file name...'
]);
```

```csharp
((IJavaScriptExecutor)driver).ExecuteScript("tb:fileExists", new Dictionary<string, object>
{
    ["fileName"] = "...the file name..."
});
```

## Retrieve (meta) properties from the downloaded file

You can check the integrity of the downloaded file during your test, with the `tb:fileProperties` command. This will return the following file (meta) data:

```json
{
  "changed_time": 1649947630,
  "created_time": 1649947629,
  "modified_time": 1649947630,
  "size": 114123,
  "md5": "5d4f7a7d4335c99048c3cc7563ffa7bf"
}
```

- `changed_time`: Indicates, in unix epoch time, when the file (permission or content) was changed. 
- `created_time`: Indicates, in unix epoch time, when the file was downloaded. 
- `modified_time`: Indicates, in unix epoch time, when the file content was changed. 
- `size`: The size of the downloaded file, in bytes. 
- `md5`: The MD5 checksum of the downloaded file. Useful to verify the integrity of the file. 

[Java](https://testingbot.com#) [Python](https://testingbot.com#) [NodeJS](https://testingbot.com#) [Ruby](https://testingbot.com#) [PHP](https://testingbot.com#) [C#](https://testingbot.com#)

```java
Map<String, Object> fileMap = new HashMap<>();
fileMap.put("fileName", "...the file name...");
((JavascriptExecutor) driver).executeScript("tb:fileProperties", fileMap);
```

```python
driver.execute_script("tb:fileProperties", {
  "fileName": "...the file name..."
})
```

```javascript
await driver.executeScript('tb:fileProperties', {
  "fileName": "...the file name..."
});
```

```ruby
driver.execute_script('tb:fileProperties', {
  'fileName' => '...the file name...'
})
```

```php
$driver->executeScript('tb:fileProperties', [
  'fileName' => '...the file name...'
]);
```

```csharp
((IJavaScriptExecutor)driver).ExecuteScript("tb:fileProperties", new Dictionary<string, object>
{
    ["fileName"] = "...the file name..."
});
```

## Retrieve the contents of the downloaded file

It is possible to download the file, which was downloaded on the remote TestingBot machine, to your own computer.   
 TestingBot has created a custom command, `tb:fileContent`, which will return a Base64-encoded string of the file content.

[Java](https://testingbot.com#) [Python](https://testingbot.com#) [NodeJS](https://testingbot.com#) [Ruby](https://testingbot.com#) [PHP](https://testingbot.com#) [C#](https://testingbot.com#)

```java
Map<String, Object> fileMap = new HashMap<>();
fileMap.put("fileName", "...the file name...");
String base64EncodedFile = (String) ((JavascriptExecutor) driver).executeScript("tb:fileContent", fileMap);
byte[] data = Base64.getDecoder().decode(base64EncodedFile);
OutputStream stream = new FileOutputStream("filename.txt");
stream.write(data);
stream.close();
```

```python
get_file_content = driver.execute_script('tb:fileContent', {
  'fileName': '...the file name...'
})
data = base64.b64decode(get_file_content)
f = open('filename.txt', 'wb')
f.write(data)
```

```javascript
const fs = require('fs');

let base64data = await driver.executeScript('tb:fileContent', {
  'fileName': '...the file name...'
});
let data = Buffer.from(base64data, 'base64');
fs.writeFileSync('filename.txt', data);
console.log('File ready');
```

```ruby
get_file_content = driver.execute_script('tb:fileContent', {
  'fileName' => '...the file name...'
})
decoded_content = Base64.decode64(get_file_content)
f = File.open('filename.txt', 'wb')
f.write(decoded_content)
f.close
```

```php
$base64content = $driver->executeScript('tb:fileContent', [
  'fileName' => '...the file name...'
]);
$decoded = base64_decode($base64content);
file_put_contents('filename.txt', $decoded);
```

```csharp
string base64encode = (string) ((IJavaScriptExecutor)driver).ExecuteScript("tb:fileContent", new Dictionary<string, object>
{
    ["fileName"] = "...the file name..."
});
byte[] b = Convert.FromBase64String(base64encode);
File.WriteAllBytes(@"filename.txt", b);
```

### Looking for more help?

Have questions or need more information? Reach out via email or Slack.

[Email us](https://testingbot.com/contact/new) [Join our Slack](https://join.slack.com/t/testingb0t/shared_invite/zt-3bcw9xch-jk19~6XPs_xBrsAgAedkCw)
