27

I'm using selenium chromedriver for automating web application. In my application, I need to download xml files. But when I download xml file, I get 'This type of file can harm your computer' pop up. I want to disable this pop up using selenium chromedriver and I want these type of files to be downloaded always. How can this be done? enter image description here

  • Selenium version : 2.47.1
  • Chromedriver version : 2.19

UPDATE it's long standing Chrome bug from 2012.

gavenkoa
  • 45,285
  • 19
  • 251
  • 303
Mosam Mehta
  • 1,658
  • 6
  • 25
  • 34
  • Does that popup has ok /cancel button? – Helping Hands Dec 07 '15 at 09:59
  • That pop up has 'Keep' and 'Discard' buttons. – Mosam Mehta Dec 07 '15 at 10:01
  • 1
    you should not disable it but you can use `alert.accept()` to handle that popup. It will click on keep and continue your script. – Helping Hands Dec 07 '15 at 10:07
  • 1
    That pop up is not application pop up. That is chrome default pop up. Attached screenshot in question. – Mosam Mehta Dec 07 '15 at 10:11
  • 1
    Ok , You can not turnoff it. Set in your chrome that ask to save file when download and then try with `alert.accept()` – Helping Hands Dec 07 '15 at 10:16
  • honestly you shouldn't use selenium to download these files, as you have little control. you should [calculate / fetch the href of the file](http://ardesco.lazerycode.com/index.php/2012/07/how-to-download-files-with-selenium-and-why-you-shouldnt/) and just download it using the language you are using. – ddavison Dec 07 '15 at 18:37

9 Answers9

22

The problem with XML files started to happen to me as of Chrome 47.0.2526.80 m. After spending maybe 6 hours trying to turn off every possible security option I tried a different approach.

Ironically, it seems that turning on the Chrome option "Protect you and your device from dangerous sites" removes the message "This type of file can harm your computer. Do you want to keep file.xml anyway?"

I am using 'Ruby' with 'Watir-Webdriver' where the code looks like this:

prefs = {
    'safebrowsing' => {
        'enabled' => true,
    }
}

b = Watir::Browser.new :chrome, :prefs => prefs

Starting the browser like this, with safebrowsing option enabled, downloads the xml files without the message warning. The principle should be the same for Selenium with any programming language.

##### Edited: 13-04-2017

In latest version of Google Chrome the above solution is not enough. Additionally, it is necessary to start the browser with the following switch:

--safebrowsing-disable-download-protection

Now, the code for starting the browser would look something like this:

b = Watir::Browser.new :chrome, :prefs => prefs, :switches => %w[--safebrowsing-disable-download-protection]))
fing
  • 358
  • 2
  • 7
  • How to do it in Java? – Mosam Mehta Dec 09 '15 at 10:29
  • 3
    According to [chromedriver/capabilities](https://sites.google.com/a/chromium.org/chromedriver/capabilities) examples it should be something like this: `ChromeOptions options = new ChromeOptions(); Map prefs = new HashMap(); prefs.put("safebrowsing.enabled", "true"); options.setExperimentalOption("prefs", prefs); ChromeDriver chromeDriver = new ChromeDriver(options);` – fing Dec 09 '15 at 21:46
  • 2
    Worked in python: `opts = webdriver.ChromeOptions(); opts.add_experimental_option('prefs', {'safebrowsing.enabled': True}); opts.add_argument('--safebrowsing-disable-download-protection'); driver = webdriver.Chrome(chrome_options=opts)` – Ross Smith II Apr 25 '17 at 06:28
6

Following Python code works for me

chromeOptions = webdriver.ChromeOptions()
prefs = {'safebrowsing.enabled': 'false'}
chromeOptions.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(chrome_options=chromeOptions)
Dmitry
  • 61
  • 1
  • 1
5

I am posting below the complete code that got file download working for me: Hope it helps :-) I am using Java-Selenium

System.setProperty("webdriver.chrome.driver", "C:/chromedriver/chromedriver.exe");
        String downloadFilepath = "D:/MyDeskDownload";
        HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
        chromePrefs.put("profile.default_content_settings.popups", 0);
        chromePrefs.put("download.default_directory", downloadFilepath);
        chromePrefs.put("safebrowsing.enabled", "true"); 
        ChromeOptions options = new ChromeOptions();
        options.setExperimentalOption("prefs", chromePrefs);
        DesiredCapabilities cap = DesiredCapabilities.chrome();
        cap.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true);
        cap.setCapability(ChromeOptions.CAPABILITY, options);
        WebDriver driver = new ChromeDriver(cap);
Mosam Mehta
  • 1,658
  • 6
  • 25
  • 34
3

The accepted answer stopped working after a recent update of Chrome. Now you need to use the --safebrowsing-disable-extension-blacklist and --safebrowsing-disable-download-protection command-line switches. This is the WebdriverIO config that works for me:

var driver = require('webdriverio');
var client = driver.remote({
    desiredCapabilities: {
        browserName: 'chrome',
        chromeOptions: {
            args: [
                'disable-extensions',
                'safebrowsing-disable-extension-blacklist',
                'safebrowsing-disable-download-protection'
            ],
            prefs: {
                'safebrowsing.enabled': true
            }
        }
    }
});

Note that I am also disabling extensions, because they generally interfere with automated testing, but this is not strictly needed to fix the problem with downloading XML and JavaScript files.

I found these switches by reading through this list. You can also see them in the Chromium source.

Community
  • 1
  • 1
chris
  • 1,638
  • 2
  • 15
  • 17
2

I came across this recently, using Katalon Studio, Chrome version 88. Thankfully just the enabling safebrowsing did the trick. You access the settings via "Project Settings" and you navigate to "Desired Capabilities" -> "Web UI" -> "Chrome". If you don't have a "prefs" setting add it and set the type to Dictionary. Then in the Value add a boolean named "safebrowsing.enabled" and set the value to "true". Result might look like: enter image description here (And you can the default directory setting has nothing to do with this example).

From Orbonia
  • 616
  • 5
  • 16
0

I used all of suggested chrome options in C# and only when my internet connected worked for me but when internet disconnected none of them work for me. (I'm not sure.may be chrome safebrowsing need to internet connection)

By using older version of chrome(version71) and chromedriver(version 2.46) and after downloading,i saw downloaded XML file name constains 'Unconfirmed' with 'crdownload' extension and parsing XML file wouldn't work properly. Finally, creating wait with Thread.Sleep(1000) solved my problem.

            IWebDriver Driver;

            //chromedriver.exe version2.46 path
            string path = @"C:\cd71";
            ChromeDriverService driverService = ChromeDriverService.CreateDefaultService(path, "chromedriver.exe");
            ChromeOptions options = new ChromeOptions();
            // options.AddArgument("headless");
            options.AddArgument("--window-position=-32000,-32000");
            options.AddUserProfilePreference("download.default_directory", @"c:\xmlFiles");
            options.AddUserProfilePreference("download.prompt_for_download", false);
            options.AddUserProfilePreference("disable-popup-blocking", "true");
            options.AddUserProfilePreference("safebrowsing.enabled", "true");
            Driver = new ChromeDriver(driverService, options);

            try
            {
                 Driver.Navigate().GoToUrl(url);
                 Thread.Sleep(1000);
                 //other works like: XML parse
            }
            catch
            {

            }
Amir Azad
  • 113
  • 5
0

For context, I had a .csv with a list of .swf flash documents and their respective urls. Since the files could only be accessed after a valid login, I couldn't use a simple requests based solution.

Just like .xml, downloading a .swf triggers a similar prompt.

None of the answers worked for me.

So I stripped away all the extra arguments and settings the above answers proposed and just made the chrome instance headless.

options.add_argument("--headless")

prefs = {
    "download.default_directory": "C:\LOL\Flash",
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
}
options.add_experimental_option("prefs",prefs)
Jibin Joseph
  • 1,265
  • 7
  • 13
-1

The only workaround that works for me:

Use argument with path to chrome profile

chromeOptions.add_argument(chrome_profile_path)

Search for file download_file_types.pb in chrome profile folder. In my case ..chromedriver\my_profile\FileTypePolicies\36\download_file_types.pb

Backup this file and then open with any hexeditor (you can use oline).

Search for the filetype you want to download, i.e. xml and change it to anything i.e. xxx

Daddy Cool
  • 31
  • 6
-1

Im using Google Version 80.0.3987.122 (Official Build) (32-bit) and ChromeDriver 80.0.3987.106. Getting the same error even after adding the below while downloading a .xml file.

$ChromeOptions = New-Object OpenQA.Selenium.Chrome.ChromeOptions
$ChromeOptions.AddArguments(@(
    "--disable-extensions",
    "--ignore-certificate-errors"))

$download = "C:\temp\download"
$ChromeOptions.AddUserProfilePreference("safebrowsing.enabled", "true");
$ChromeOptions.AddUserProfilePreference("download.default_directory", $download);
$ChromeOptions.AddUserProfilePreference("download.prompt_for_download", "false");
$ChromeOptions.AddUserProfilePreference("download.directory_upgrade", "true");

$ChromeDriver = New-Object OpenQA.Selenium.Chrome.ChromeDriver($chromeOptions)
Enigma
  • 123
  • 1
  • 13