Как автоматически загрузить файл CSV через Selenium (Python), не открывая диалоговое окно

Моя среда:

Firefox version : 78.9.0esr (64 bits)
Web driver : geckodriver-v0.26.0-win64
OS: Windows 10 (64 bits)
Python version: 3.8 (64 bits)
Python Selenium package version : 3.141.0

Мое требование - загрузить файл CSV с веб-страницы через Selenium (код Python), но не открывая диалоговое окно. Я имею в виду, что если вы вручную нажмете кнопку загрузки, произойдет следующее: вы увидите диалоговое окно с запросом имени (если вы хотите изменить имя по умолчанию) и место для сохранения файла. Что я хочу сделать, так это обойти шаг диалогового окна, поэтому, когда Selenium нажимает кнопку, конкретный файл загружается в какой-то каталог по умолчанию, который я указал с его именем по умолчанию. После долгих гуглений (включая темы на stackoverflow.com) я понял, что этого можно добиться следующим образом, создав новый профиль для экземпляра Firefox, который использует Selenium. Итак, вот мой код:

self.profile = webdriver.FirefoxProfile()
self.profile.set_preference("browser.preferences.instantApply", True)
self.profile.set_preference("browser.download.folderList", 2)
self.profile.set_preference("browser.download.dir", os.getcwd())
self.profile.set_preference(
    "browser.helperApps.neverAsk.saveToDisk",
    "text/csv;charset=ISO-8859-1"
)
self.profile.set_preference(
    "browser.helperApps.neverAsk.openFile",
    "text/csv;charset=ISO-8859-1"
)
self.profile.set_preference(
    "browser.download.manager.showWhenStarting",
    False
)
self.profile.set_preference(
    "browser.download.manager.showAlertOnComplete",
    False
)
self.profile.set_preference("browser.download.panel.shown", False)
self.profile.set_preference(
    "browser.download.manager.focusWhenStarting",
    False
)
self.profile.set_preference(
    "browser.download.manager.useWindow",
    False
)
self.profile.set_preference(
    "browser.download.manager.closeWhenDone",
    False
)
self.web_driver = webdriver.Firefox(firefox_profile=self.profile)

Теперь проблема с вышеупомянутым кодом заключается в том, что он по-прежнему открывает диалоговое окно, и работает только следующая часть:

self.profile.set_preference("browser.download.folderList", 2)
self.profile.set_preference("browser.download.dir", os.getcwd()

Но помимо этого сохраняется основная проблема, то есть каждый раз появляется диалоговое окно. Сейчас я просмотрел множество страниц в Интернете (форумы, учебные пособия и т. д.), и когда я сравниваю их предлагаемые коды, мне кажется, что я действовал таким же образом, и я не вижу, что еще в терминах команды/параметра следует/можно добавить, чтобы предотвратить открытие диалогового окна и вместо этого автоматически загрузить файл CSV. Я был бы признателен, если бы вы любезно прояснили и указали, в чем проблема с моим кодом.


person user17911    schedule 29.03.2021    source источник


Ответы (1)


Итак, после долгих поисков в Интернете я, наконец, нашел ответ на свой вопрос на странице параметров самого firefox (about:config): browser.download.useDownloadDir

Вот новая версия моего кода, которая работает очень хорошо и выполняет свою работу:

self.profile = webdriver.FirefoxProfile()
self.profile.set_preference("browser.download.folderList", 2)
self.profile.set_preference("browser.download.dir", os.getcwd())
self.profile.set_preference(
    "browser.helperApps.neverAsk.saveToDisk",
    "text/csv"
)
self.profile.set_preference("browser.download.useDownloadDir", True)
self.web_driver = webdriver.Firefox(firefox_profile=self.profile)

Итак, что изменилось в этой новой версии по сравнению с предыдущей версией:

  • Я изменил тип MIME, чтобы он был просто text/csv вместо text/csv;charset=ISO-8859-1

  • Я удалил несколько параметров профиля, которые, кажется, не влияют на результат.

  • И самое главное, я добавил в свой профиль параметр browser.download.useDownloadDir. Основываясь на различных тестах, которые я провел, кажется, что одного параметра browser.helperApps.neverAsk.saveToDisk недостаточно. Действительно, как только вы определите желаемый каталог загрузки с помощью browser.download.dir, вам действительно нужно явно указать Firefox с помощью параметра browser.download.useDownloadDir, чтобы браузер автоматически использовал этот каталог каждый раз при загрузке файлов.

Я надеюсь, что это может помочь тем, кто, возможно, столкнулся с той же проблемой.

person user17911    schedule 30.03.2021