Downloading file to specified location with Selenium and python
Question:
Ok so far i have my programing going to the website i want to download link from and selecting it, then the firefox dialogue box shows up and i don’t know what to do. i want to save this file to a folder on my desktop. I am using this for a nightly build so i need this to work. Please help.
Here is my code that grabs the download link from the website:
driver = web driver.Firefox()
driver.implicitly_wait(5)
driver.get("Name of web site I'm grabbing from")
driver.find_element_by_xpath("//a[contains(text(), 'DEV.tgz')]".click()
Answers:
You need to make Firefox
save this particular file type automatically.
This can be achieved by setting browser.helperApps.neverAsk.saveToDisk
preference:
from selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.set_preference("browser.download.folderList", 2)
profile.set_preference("browser.download.manager.showWhenStarting", False)
profile.set_preference("browser.download.dir", 'PATH TO DESKTOP')
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/x-gzip")
driver = webdriver.Firefox(firefox_profile=profile)
driver.get("Name of web site I'm grabbing from")
driver.find_element_by_xpath("//a[contains(text(), 'DEV.tgz')]").click()
More explanation:
browser.download.folderList
tells it not to use default Downloads
directory
browser.download.manager.showWhenStarting
turns of showing download progress
browser.download.dir
sets the directory for downloads
browser.helperApps.neverAsk.saveToDisk
tells Firefox to automatically download the files of the selected mime-types
You can view all these preferences at about:config
in the browser. There is also a very detailed documentation page available here: About:config entries.
Besides, instead of using xpath
approach, I would use find_element_by_partial_link_text()
:
driver.find_element_by_partial_link_text("DEV.tgz").click()
Also see:
If the application is generated dynamically (mime-types) using Chrome browser will be a better approach since the Chrome will not open the file download pop-up.But multiple download option should be enabled if you need multiple downloads.
@alecxe’s answer updated – firefox_profile
has been deprecated; this answer works as of March 2023, Firefox 110, Python 3.9, Selenium 4.8.2:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
options = Options()
options.set_preference("browser.download.folderList", 2)
options.set_preference("browser.download.manager.showWhenStarting", False)
options.set_preference("browser.download.dir", 'PATH TO DESKTOP')
options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/x-gzip")
driver = webdriver.Firefox(options=options)
driver.get("Name of web site I'm grabbing from")
driver.find_element_by_xpath("//a[contains(text(), 'DEV.tgz')]").click()
Ok so far i have my programing going to the website i want to download link from and selecting it, then the firefox dialogue box shows up and i don’t know what to do. i want to save this file to a folder on my desktop. I am using this for a nightly build so i need this to work. Please help.
Here is my code that grabs the download link from the website:
driver = web driver.Firefox()
driver.implicitly_wait(5)
driver.get("Name of web site I'm grabbing from")
driver.find_element_by_xpath("//a[contains(text(), 'DEV.tgz')]".click()
You need to make Firefox
save this particular file type automatically.
This can be achieved by setting browser.helperApps.neverAsk.saveToDisk
preference:
from selenium import webdriver
profile = webdriver.FirefoxProfile()
profile.set_preference("browser.download.folderList", 2)
profile.set_preference("browser.download.manager.showWhenStarting", False)
profile.set_preference("browser.download.dir", 'PATH TO DESKTOP')
profile.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/x-gzip")
driver = webdriver.Firefox(firefox_profile=profile)
driver.get("Name of web site I'm grabbing from")
driver.find_element_by_xpath("//a[contains(text(), 'DEV.tgz')]").click()
More explanation:
browser.download.folderList
tells it not to use defaultDownloads
directorybrowser.download.manager.showWhenStarting
turns of showing download progressbrowser.download.dir
sets the directory for downloadsbrowser.helperApps.neverAsk.saveToDisk
tells Firefox to automatically download the files of the selectedmime-types
You can view all these preferences at about:config
in the browser. There is also a very detailed documentation page available here: About:config entries.
Besides, instead of using xpath
approach, I would use find_element_by_partial_link_text()
:
driver.find_element_by_partial_link_text("DEV.tgz").click()
Also see:
If the application is generated dynamically (mime-types) using Chrome browser will be a better approach since the Chrome will not open the file download pop-up.But multiple download option should be enabled if you need multiple downloads.
@alecxe’s answer updated – firefox_profile
has been deprecated; this answer works as of March 2023, Firefox 110, Python 3.9, Selenium 4.8.2:
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
options = Options()
options.set_preference("browser.download.folderList", 2)
options.set_preference("browser.download.manager.showWhenStarting", False)
options.set_preference("browser.download.dir", 'PATH TO DESKTOP')
options.set_preference("browser.helperApps.neverAsk.saveToDisk", "application/x-gzip")
driver = webdriver.Firefox(options=options)
driver.get("Name of web site I'm grabbing from")
driver.find_element_by_xpath("//a[contains(text(), 'DEV.tgz')]").click()