50

I am trying to automatically download some links through selenium's click functionality and I am using a chrome webdriver and python as the programming language. How can I select the download directory through the python program so that it does not get downloaded in the default Downloads directory. I found a solution for firefox but there the download dialog keeps popping up every time it clicks on the link which does not happen in Chrome.

Blaszard
  • 30,954
  • 51
  • 153
  • 233
Shubham Goyal
  • 617
  • 1
  • 7
  • 18
  • Go to chrome settings and check Ask to save each file before downloading – camelCaseCoder Feb 11 '16 at 06:02
  • Possible duplicate of [setting Chrome preferences w/ Selenium Webdriver in Python](http://stackoverflow.com/questions/18026391/setting-chrome-preferences-w-selenium-webdriver-in-python) – Remi Guan Feb 11 '16 at 06:21

11 Answers11

131

I found the accepted solution didn't work, however this slight change did:

from selenium import webdriver

chrome_options = webdriver.ChromeOptions()
prefs = {'download.default_directory' : '/path/to/dir'}
chrome_options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(chrome_options=chrome_options)
peter.sva
  • 17
  • 4
hoju
  • 28,392
  • 37
  • 134
  • 178
  • 1
    Thanks! This really solve my problem. However, it seems not working for relative path. e.g. D:/ddd works while ./tmp does not. The ./tmp (relative path) ends up poping up a dialog for me to manually choose the directory... – Shao-Kui Mar 14 '19 at 09:04
  • 3
    Is there a way to change download path while on **current session**, similar to how you click Chrome Settings->Download ? The answer I saw always incur **building new option + new driver + get a whole new session** . I would wish not to close the current session, since my folder separation based on each item in a drop-down list and there's no need to reload a new page. There are thousands of items in that drop-down; the accepted method means closing and loading the page thousands times. – Kenny Sep 15 '19 at 22:13
  • It's works! Mac `google chrome 78.0.3904.97` and `chromedriver 2.40` – Ferris Nov 29 '19 at 10:07
  • How to change the default directory after WebDriver started? – Rodrigo Vieira Dec 21 '20 at 17:24
  • How to get the name of file downloaded? – Rodrigo Vieira Dec 21 '20 at 17:24
  • chrome_options is deprecated – thang Feb 06 '21 at 02:41
  • Doesn't work for me and I am getting a download error. Code works fine for default download directory though (Windows) – Sandeep Sep 30 '21 at 16:16
  • 2
    Code worked for me and I don't get any down error. Also Chrome_Options is deprecated so I used options instead earlier the path was C:/Users/myusname/drivers/DownloadFiles I changed it to C:\Users\myusname\drivers\DownloadFiles\\ downloadFilepath = r"C:\Users\myusname\drivers\DownloadFiles\\"; chrome_options = webdriver.ChromeOptions() prefs = {"download.default_directory" : downloadFilepath} options.add_experimental_option('prefs', prefs) driver=webdriver.Chrome(executable_path=chromedriver,options=options) Solution: https://stackoverflow.com/a/42943611/1604050 – Sandeep Sep 30 '21 at 16:30
  • @Kenny is this possible. Did you find the solution ? – Aswin Babu May 10 '22 at 06:53
27

Update 2018:

Its not valid Chrome command line switch, see the source code use hoju answer below to set the Preferences.

Original:

You can create a profile for chrome and define the download location for the tests. Here is an example:

from selenium import webdriver

options = webdriver.ChromeOptions() 
options.add_argument("download.default_directory=C:/Downloads")

driver = webdriver.Chrome(chrome_options=options)
ewwink
  • 18,382
  • 2
  • 44
  • 54
Sarunas Urbelis
  • 567
  • 5
  • 14
14

the exact problem I also have faced while trying to do exactly same what you want to :)

For chrome:

from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("--start-maximized")
prefs = {"profile.default_content_settings.popups": 0,
             "download.default_directory": 
                        r"C:\Users\user_dir\Desktop\\",#IMPORTANT - ENDING SLASH V IMPORTANT
             "directory_upgrade": True}
options.add_experimental_option("prefs", prefs)
browser=webdriver.Chrome(<chromdriver.exe path>, options=options)

For Firefox: follow this blog for the answer: https://srirajeshsahoo.wordpress.com/2018/07/26/how-to-bypass-pop-up-during-download-in-firefox-using-selenium-and-python/

The blog says all about the pop-up and downloads dir and how to do

5

Using prefs solved my problem

path = os.path.dirname(os.path.abspath(__file__))
prefs = {"download.default_directory":path}
options = Options()
options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome('../harveston/chromedriver.exe',options = options)
user9763662
  • 51
  • 1
  • 2
4

This worked for me on Chrome v81.0.4044.138

preferences = {
                "profile.default_content_settings.popups": 0,
                "download.default_directory": os.getcwd() + os.path.sep,
                "directory_upgrade": True
            }

chrome_options.add_experimental_option('prefs', preferences)
browser = webdriver.Chrome(executable_path="/usr/bin/chromedriver", options=chrome_options)
CodeWalker
  • 2,281
  • 4
  • 23
  • 50
  • 1
    This one is working also on `Chrome 80.0.3987.149`. I tried the other answers above and they didn't work on my Ubuntu machine. Thanks @CodeWalker – Nwawel A Iroume May 17 '20 at 12:18
  • ditto for working with 81.0.4044.69. needs add of chrome_options = webdriver.ChromeOptions() – CodingMatters Jun 01 '20 at 04:31
  • also: webdriver.Chrome(options=blah) supercedes webdriver.Chrome(chrome_options=blah) I would use a variable name other than chrome_options or options to avoid confusion. – CodingMatters Jun 01 '20 at 04:32
  • The chrome_options is deprecated now. And if I use the options as mentioned in previous comment does not work(I wonder why it is not working). The above code works in my Mac of Chrome Version 83 – Gopinath V S Jun 30 '20 at 11:12
1

I see that many people have the same problem, just add the backslash at the end

op = webdriver.ChromeOptions()
prefs = {'download.default_directory' : 'C:\\Users\\SAJComputer\\PycharmProjects\\robot-test\\'}
op.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome(executable_path=driver_path , options=op)
Alireza M
  • 11
  • 2
  • Instead of using double backslash in the path you can convert the path as raw string using r'C:\Users\SAJComputer\PycharmProjects\robot-test' – Shekhar Samanta Oct 01 '22 at 08:35
1

Update 2022:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

options = Options()

prefs = {"download.default_directory" : "C:\YourDirectory\Folder"}

options.add_experimental_option("prefs", prefs)

driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=options)
0

If you are using linux distribution

Use this code

prefs = {'download.prompt_for_download': False,
         'download.directory_upgrade': True,
         'safebrowsing.enabled': False,
         'safebrowsing.disable_download_protection': True}

options.add_argument('--headless')
options.add_experimental_option('prefs', prefs)
driver = webdriver.Chrome('chromedriver.exe', chrome_options=options)
driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
driver.desired_capabilities['browserName'] = 'ur mum'
params = {'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': r'C:\chickenbutt'}}
driver.execute("send_command", params)
GDorn
  • 8,511
  • 6
  • 38
  • 37
Alex Montoya
  • 4,697
  • 1
  • 30
  • 31
0

To provide download directory and chrome's diver executable path use the following code.

from selenium import webdriver
options = webdriver.ChromeOptions() 
options.add_argument("download.default_directory=C:/Your_Directory")
driver = webdriver.Chrome(options=options ,executable_path='C:/chromedriver')

change the path in your code accordingly.

vsnahar
  • 77
  • 3
0

Below code snippet holds good for Windows/linux/MacOs distro:

    downloadDir = f"{os.getcwd()}//downloads//"
    # Make sure path exists.
    Path(downloadDir).mkdir(parents=True, exist_ok=True)
    
    # Set Preferences.
    preferences = {"download.default_directory": downloadDir,
                   "download.prompt_for_download": False,
                   "directory_upgrade": True,
                   "safebrowsing.enabled": True}

    chromeOptions = webdriver.ChromeOptions()
    chromeOptions.add_argument("--window-size=1480x560")
    chromeOptions.add_experimental_option("prefs", preferences)

    driver = webdriver.Chrome(DRIVER_PATH, options=chromeOptions)
    driver.get(url)
    time.sleep(10)
    driver.close()
Abhishake Gupta
  • 2,939
  • 1
  • 25
  • 34
-7

This is non code level solution with no chrome profiling/options settings.

If you are using script only on your local machine then use this solution

Click on Menu -> Setting -> Show advanced settings... -> Downloads

Now uncheck

Ask where to save each file before downloading

enter image description here

Hope it will help you :)

Shubham Jain
  • 16,610
  • 15
  • 78
  • 125
  • 1
    This question is about controlling chrome through an automated system called selenium. You answered as if he asked about controlling chrome manually. – Gus Sep 28 '16 at 15:52
  • 2
    It's a one time configuration you have to made and yes it's a solution too – Shubham Jain Oct 08 '16 at 12:36
  • 1
    This is actually a valid and working answer. It worked perfectly for me. – Private Oct 17 '16 at 08:43
  • Please rate this answer .. I need to remove it if it will have negative rating – Shubham Jain Mar 12 '17 at 12:05
  • 1
    Shubam had answered it well. Set your chrome profile's default directory and then it will be the solution. – GigaByte Mar 21 '20 at 21:49
  • The goal is to change this configuration through Selenium and not manually... the whole point of Selenium is to automatize. – Haddock-san Jul 08 '20 at 14:10
  • Doesn’t you all guys just look it at a solution for local as I said and if not work then downgrade me .. so if I delete this working solution and no one else can see even if useful for them does that make all happy? – Shubham Jain Jul 08 '20 at 14:13