【问题标题】:Selenium Webdriver in Python - files download directory change in Chrome preferencesPython 中的 Selenium Webdriver - Chrome 首选项中的文件下载目录更改
【发布时间】:2013-08-04 06:50:02
【问题描述】:

我正在使用 Selenium Webdriver(在 Python 中)自动下载数千个文件。我想以编程方式设置 Chrome 的下载文件夹。看完this,我试了一下:

chromepath = '/Users/thiagomarzagao/Desktop/searchcode/chromedriver'
desired_caps = {'prefs': {'download': {'default_directory': '/Users/thiagomarzagao/Desktop/downloaded_files/'}}}
driver = webdriver.Chrome(executable_path = chromepath, desired_capabilities = desired_caps)

不好。下载仍会转到默认下载文件夹(“/Users/thiagomarzagao/Downloads”)。

有什么想法吗?

(Python 2.7.5、Selenium 2.2.0、Chromedriver 2.1.210398、Mac OS X 10.6.8)

【问题讨论】:

    标签: python python-2.7 selenium-webdriver selenium-chromedriver


    【解决方案1】:

    以下内容对我有用:

    chromeOptions = webdriver.ChromeOptions()
    prefs = {"download.default_directory" : "/some/path"}
    chromeOptions.add_experimental_option("prefs",prefs)
    chromedriver = "path/to/chromedriver.exe"
    driver = webdriver.Chrome(executable_path=chromedriver, options=chromeOptions)
    

    来源:https://sites.google.com/a/chromium.org/chromedriver/capabilities

    【讨论】:

    • 这看起来很有希望。唉,最后我完全放弃了 Chrome 并完全重写了代码,但最终我会回到它并测试你的解决方案。
    • 唉,我刚刚测试了它,它对我不起作用。代码不会崩溃,它只是默默地不下载任何内容。
    • 一个几乎相同的版本对我有用,我在 Chrome 调用中省略了 executable_path=chromedriver, 参数。
    • 我是否正确理解此解决方案将重新启动驱动程序,因此您需要 driver.get(_) 一个新站点来承担此设置?有没有不需要新会话的方法?我想保留旧会话,只需修改下载位置,就像我们可以手动使用可用的 Chrome 会话一样。我正在下载多个文件,并希望将每个批次保存到各自的目录中。
    • 有没有办法在 当前会话 上更改下载路径,类似于单击 Chrome 设置->下载的方式?我看到的答案总是导致 build new option + new driver + get a whole new session 。我不希望关闭当前会话,因为我的文件夹分离基于下拉列表中的每个项目,并且无需重新加载新页面。该下拉列表中有数千个项目;接受的方法意味着关闭和加载页面数千次。
    【解决方案2】:

    如果有人仍然遇到问题并且上述解决方案不起作用,我发现在我的下载路径中添加了一个斜杠 ('\')。

    我的看起来像这样:

        if browser == 'chrome':
            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)
            return webdriver.Chrome(executable_path=Base.chromedriver_dir, chrome_options=options)
    

    【讨论】:

    • 你是摇滚明星。这应该是最好的答案
    • @yvesva 在“开始最大化”之前添加双破折号的目的是什么?
    • 这对 Linux (Ubuntu) 也有帮助 - 我遇到了完全相同的问题。在我的自定义下载文件夹中添加尾部斜杠使其工作:“/home/me/Desktop/”而不是“/home/me/Desktop”。谢谢你的回答,@yvesva :)
    • 嗯。遗憾的是,现在是 2020 年,仍然在下载路径中添加斜杠以使我们的代码正常工作。
    • @manas --start-maximized 不是下载路径工作所必需的
    【解决方案3】:

    我觉得你也需要

    "directory_upgrade": true
    

    直接在 Chrome 的“首选项”文件中使用字典,在本地 windows 安装 chrome 版本 28.0.1500.95 m,具有以下下载选项:

       "download": {
          "default_directory": "C:\\Users\\rdub\\Desktop",
          "extensions_to_open": ""
       },
    

    我得到的是默认位置,而不是桌面。当我将其更改为:

       "download": {
          "default_directory": "C:\\Users\\rdub\\Desktop",
          "directory_upgrade": true,
          "extensions_to_open": ""
       },
    

    我得到了桌面位置。

    尝试以下方法:

    desired_caps = {'prefs': {'download': {'default_directory': '/Users/thiagomarzagao/Desktop/downloaded_files/', "directory_upgrade": true, "extensions_to_open": ""}}}
    

    【讨论】:

    • 不知何故这对我不起作用。我在代码中将“default_directory”和“extensions_to_open”首选项添加到该字典中,但下载的文件仍会转到默认文件夹。我什至尝试了"true" 和True(因为我不知道它应该是字符串还是布尔值),但两种语法都不起作用。
    • 不幸的是,直接修改 Chrome 的 Preferences 文件对我来说不是一个选项。问题是,我需要在我的 Python 脚本上设置下载文件夹,而不是在 Chrome 的首选项文件上。 (那是因为我需要有几个不同的下载文件夹并遍历它们,将几百个下载的文件保存到每个文件夹)。
    • 我不建议您手动编辑文件,我只是将该方法用作快速测试平台。您是否尝试将 directory_upgrade 设置为 true?这对我来说是关键。
    • 使用代码示例编辑答案。另一种想法......桌面上是否存在下载的文件文件夹?
    • 感谢您的跟进,R Dub。唉,我还是不能让它工作。我已将 directory_upgrade 设置为 true,但效果不好(我尝试将它作为字符串 - "true" - 和作为布尔值 - True)。桌面上确实存在下载的文件文件夹。您提到您正在使用 Windows 安装,所以我想知道这是否是 Mac 的问题。好吧,我会继续努力的。
    【解决方案4】:
    # -*- coding: utf-8 -*-
    from selenium import webdriver 
    from selenium.webdriver.chrome.options import Options
    import time
    temp_directory = ""
    chrome_options = Options()
    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--window-size=1920x1080")
    chrome_options.add_argument("--disable-notifications")
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--verbose')
    chrome_options.add_experimental_option("prefs", {
            "download.default_directory": "<path to the folder of download>",
            "download.prompt_for_download": False,
            "download.directory_upgrade": True,
            "safebrowsing_for_trusted_sources_enabled": False,
            "safebrowsing.enabled": False
    })
    chrome_options.add_argument('--disable-gpu')
    chrome_options.add_argument('--disable-software-rasterizer')
    url = "https://www.thinkbroadband.com/download"
    driver = webdriver.Chrome(executable_path = './chromedriver' ,chrome_options = chrome_options)
    driver.get(url)
    time.sleep(5)
    driver.find_element_by_css_selector("div.module:nth-child(8) > p:nth-child(1) > a:nth-child(1) > img:nth-child(1)").click()
    

    【讨论】:

    • 在我的情况下,我只需要在 chrome 选项中传递参数,在 prefs download.default_directory 中:path/to/file 为我工作
    • 请记住,我看到很多情况取决于 selenium 驱动程序的版本,自定义下载目录仅适用于无头模式。
    【解决方案5】:

    我尝试了这个问题中的所有答案,但它不适用于我的 Ubuntu 16.10。因此,我为变量 XDG_DOWNLOAD_DIR 添加了 os.environ 的更改。这不起作用,但我认为它有帮助。

    即:

    os.environ['XDG_DOWNLOAD_DIR'] = default_download_directory
    

    对我来说很完美真正的改变是通过命令 xdg-user-dirs-update 在执行时通过系统调用设置下载文件夹: p>

    os.system("xdg-user-dirs-update --set DOWNLOAD " + default_download_directory)
    

    所以,我所有与设置下载目录相关的代码如下:

    import os
    from selenium import webdriver
    
    default_download_directory = str(os.path.dirname(os.path.abspath(__file__))) + "/download"
    
    os.environ['XDG_DOWNLOAD_DIR'] = default_download_directory
    
    os.system("xdg-user-dirs-update --set DOWNLOAD " + default_download_directory)
    
    desired_caps = {
        'prefs': {
                'download': {
                    'default_directory': str(os.path.dirname(os.path.abspath(__file__))) + "/download", 
                    "directory_upgrade": "true", 
                    "extensions_to_open": ""
                    }
                  }
            }
    
    options = webdriver.ChromeOptions() 
    options.add_argument("download.default_directory=" + str(os.path.dirname(os.path.abspath(__file__))) + "/download")
    
    browser = webdriver.Chrome(chrome_options=options, desired_capabilities=desired_caps)
    

    【讨论】:

    • 所以您的解决方案是在我运行它的机器上在系统范围内永久设置它?因此,当任何其他应用程序(即使在此脚本之外)想要下载文件夹时,它会获取此脚本最后设置的内容,对吗?
    • 你是对的,将变量设置为系统范围存在很大问题(我发现你几周前评论的副作用)。解决方法可以暂时存储旧路径并在完成应用程序后恢复(并确保在脚本失败时恢复路径)。如果您有更好的想法来避免这种情况,我想知道;)
    【解决方案6】:

    对于仍然想知道为什么他们的实现不起作用的任何人:您必须输入完整路径才能使其工作。例如'/Users/you/dlfolder' 不起作用,而 'C:/Users/you/dlfolder' 会。

    【讨论】:

      【解决方案7】:

      将变量传递给“download.default_directory”

      将目录路径存储在变量中并将变量传递给“download.default_directory”

      注意: 同一位置的 .py 文件和文件夹“PDF_Folder”均应下载到 文件夹“PDF_Folder”

      exepath = sys.arg[0]
      # get the path from the .py file
      Dir_path = os.path.dirname(os.path.abspath(exepath))
      # get the path of "PDF_Folder" directory
      Download_dir = Dir_path+"\\PDF_Folder\\"
      
      preferences = {"download.default_directory": Download_dir , # pass the variable
                         "download.prompt_for_download": False,
                         "directory_upgrade": True,
                         "safebrowsing.enabled": True }
      chrome_options.add_experimental_option("prefs", preferences)
      driver = webdriver.Chrome(chrome_options=chrome_options,executable_path=r'/pathTo/chromedriver')
      driver.get("urlfiletodownload");
      

      【讨论】:

        【解决方案8】:

        这似乎对我有用

        chrome_options = webdriver.ChromeOptions()
        settings = {
               "recentDestinations": [{
                    "id": "Save as PDF",
                    "origin": "local",
                    "account": "",
                }],
                "selectedDestinationId": "Save as PDF",
                "version": 2,
        
            }
        
        
        
        prefs = {'savefile.default_directory': '/Users/gregreynders/PycharmProjects/Webscraper'}
        chrome_options.add_experimental_option('prefs', prefs)
        chrome_options.add_argument('--kiosk-printing')
        
        
        driver = webdriver.Chrome(chrome_options=chrome_options , executable_path="/Applications/chrome/chromedriver" )
        driver.get("https://google.com")
        driver.execute_script('window.print();')
        driver.quit()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-12-22
          • 2014-08-21
          • 2023-04-04
          • 2018-04-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多