以无头模式通过谷歌浏览器下载文件

新手上路,请多包涵

我在 Cromedrive 中以“正常”模式编写代码并且工作正常。当我更改为无头模式时,它不会下载文件。我已经尝试了我在互联网上找到的代码,但没有用。

 chrome_options = Options()
chrome_options.add_argument("--headless")
self.driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=r'{}/chromedriver'.format(os.getcwd()))
self.driver.set_window_size(1024, 768)
self.driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')

params = {'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': os.getcwd()}}
self.driver.execute("send_command", params)

任何人都知道如何解决这个问题?

PS:我不一定需要使用 Chomedrive。如果它在另一个驱动器上工作,那对我来说很好。

原文由 CBury 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
1 个回答

首先是解决方案

最低先决条件:

要在 本网站 中单击带有文本作为 下载数据 的元素来下载文件,您可以使用以下解决方案:

  • 代码块:
   from selenium import webdriver
  from selenium.webdriver.common.by import By
  from selenium.webdriver.support.ui import WebDriverWait
  from selenium.webdriver.support import expected_conditions as EC
  from selenium.webdriver.chrome.options import Options

  options = Options()
  options.add_argument("--headless")
  options.add_argument("--window-size=1920,1080")
  options.add_experimental_option("excludeSwitches", ["enable-automation"])
  options.add_experimental_option('useAutomationExtension', False)
  driver = webdriver.Chrome(chrome_options=options, executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe', service_args=["--log-path=./Logs/DubiousDan.log"])
  print ("Headless Chrome Initialized")
  params = {'behavior': 'allow', 'downloadPath': r'C:\Users\Debanjan.B\Downloads'}
  driver.execute_cdp_cmd('Page.setDownloadBehavior', params)
  driver.get("https://www.mockaroo.com/")
  driver.execute_script("scroll(0, 250)");
  WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button#download"))).click()
  print ("Download button clicked")
  #driver.quit()

  • 控制台输出:
   Headless Chrome Initialized
  Download button clicked

  • 文件下载快照:

ChromeHeadless下载


细节

通过 Headless Chromium 下载文件是自推出 Headless Chrome 以来最受欢迎的功能之一。

从那时起,不同的贡献者发布了不同的解决方法,其中一些是:

现在,好消息是 Chromium 团队正式宣布了 通过 Headless Chromium 下载文件 的功能的到来。


在讨论 中 Headless mode doesn’t save file downloads @eseckler 提到:

headless 中的下载工作略有不同。有 Page.setDownloadBehavior devtools 命令来设置下载文件夹。我们正在研究一种使用 DevTools 网络拦截的方法,也可以通过 DevTools 流式传输下载的文件。

详细讨论可以在 问题 696481 中找到:Headless 模式不保存文件下载

最后, @bugdroid 修订版似乎为我们解决了这个问题。


[ChromeDriver] 新增支持headless模式下载文件

以前,以无头模式运行的 Chromedriver 无法正确下载文件,因为它会稀疏地解析提供给它的首选项文件。 headless chrome 团队的工程师建议使用 DevTools 的“Page.setDownloadBehavior”来解决这个问题。此更改列表实现此修复。下载的文件默认到当前目录,可以在实例化 chromedriver 实例时使用 download_dir 进行设置。还添加了测试以确保正确的下载功能。

这是 修订提交

来自 ChromeDriver v77.0.3865.40 (2019-08-20) 发行说明:

 Resolved issue 2454: Headless mode doesn't save file downloads [Pri-2]


解决方案


结局

然而, Mac OSX 用户需要等待他们的馅饼,因为 在 Chromedriver 上,headless chrome 在 MacOSX 上发送 Page.setDownloadBehavior 后崩溃

原文由 undetected Selenium 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题