【问题标题】:Failed - Download Error when downloading in Selenium headless Chrome失败 - 在 Selenium 无头 Chrome 中下载时出现下载错误
【发布时间】:2018-11-25 21:43:58
【问题描述】:

我正在尝试使用 Selenium 在 Chrome 中下载文件。我发现无头 Chrome 默认情况下不允许文件下载,并应用了workaround。但是,实施该解决方法会导致某些文件在 Chrome 中生成 Failed - Download Error

driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
params = {'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': abs_path}}
driver.execute('send_command', params)

我的代码如下所示:

chrome_options = webdriver.ChromeOptions()
prefs = {
    "download.prompt_for_download": False,  # allow automatic downloads
    "plugins.always_open_pdf_externally": True,  # allow download of pdf instead of open in plugin
    "download.default_directory": path,
    "safebrowsing.enabled": False  # allow download of .msi, .exe files, etc.
}
chrome_options.add_experimental_option("prefs", prefs)
driver = webdriver.Chrome(chrome_options=chrome_options)

driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')
params = {'cmd': 'Page.setDownloadBehavior', 'params': {'behavior': 'allow', 'downloadPath': path}}
driver.execute('send_command', params)

for url in file_urls:  # file_urls here is a list of download links
    driver.get(url)

在搜索了Download error的常见原因后,我排除的事情是:

  1. 下载路径不正确:有相同下载路径的文件可以下载,有的可以下载
  2. 文件路径过长:部分可下载文件的路径比有错误的文件路径长

删除解决方法后,所有文件都可以正常下载,但我将无法在无头模式下下载。任何建议都会有所帮助。

附加信息:
ChromeDriver 版本:2.40.565498
Chrome 版本:67.0.3396.87

【问题讨论】:

  • 你有没有解决这个问题?我注意到在 not headless 时能够下载的类似问题,但是一旦打开 headless,文件就不会下载。
  • 不,这是一项安全功能,我发现的唯一当前解决方案只是对我不起作用的解决方法。我想与此同时,我只需要等待开发人员实现无头下载的功能。
  • 我能够使用这个答案让它工作:stackoverflow.com/questions/45631715/…。希望对您有所帮助。
  • 我将它应用到我的代码中,一些文件可以下载,但其他文件失败并显示Download error 消息。不过还是谢谢!

标签: python google-chrome selenium


【解决方案1】:

你可以试试disabling security,也许会奏效

我建议不要在无头模式下运行,我们也在 Linux 服务器中运行 selenium,我们选择使用单独的 selenium docker 容器(网络服务器)并创建远程驱动程序而不是本地驱动程序:

查看this page了解更多信息

安装 docker 后,您可以使用此命令启动 selenium

docker run -d -p 4444:4444 -v /dev/shm:/dev/shm --network host selenium/standalone-chrome:3.141.59-neon

确保拥有--network host,以便可以从localhost 访问4444 端口。之后,您可以通过这样做简单地创建一个远程驱动程序

from selenium import webdriver

driver = webdriver.Remote(command_executor = exec_path or 'http://localhost:4444/wd/hub'))

这样你就不必担心硒的任何事情,专注于你的项目

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-12
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多