python - 使用 chrome headless 和 selenium 下载

标签 python google-chrome selenium google-chrome-headless

我正在使用 python-selenium 和 Chrome 59 并尝试自动化一个简单的下载序列。当我正常启动浏览器时,可以下载,但是当我在 headless 模式下这样做时,下载不起作用。

# Headless implementation
from selenium import webdriver

chromeOptions = webdriver.ChromeOptions()
chromeOptions.add_argument("headless")

driver = webdriver.Chrome(chrome_options=chromeOptions)

driver.get('https://www.mockaroo.com/')
driver.find_element_by_id('download').click()
# ^^^ Download doesn't start

# Normal Mode
from selenium import webdriver

driver = webdriver.Chrome()

driver.get('https://www.mockaroo.com/')
driver.find_element_by_id('download').click()
# ^^^ Download works normally

我什至尝试过添加默认路径:

prefs = {"download.default_directory" : "/Users/Chetan/Desktop/"}
chromeOptions.add_argument("headless")
chromeOptions.add_experimental_option("prefs",prefs)

添加默认路径在正常实现中有效,但同样的问题在 headless 版本中仍然存在。

如何让下载以 headless 模式开始?

最佳答案

是的,为了安全起见,这是一个“功能”。如前所述,这里是错误讨论:https://bugs.chromium.org/p/chromium/issues/detail?id=696481

在 chrome 版本 62.0.3196.0 或更高版本中添加了支持以启用下载。

这是一个python实现。我必须将该命令添加到 chromedriver 命令中。我将尝试提交 PR,以便将来将其包含在库中。

def enable_download_in_headless_chrome(self, driver, download_dir):
    # add missing support for chrome "send_command"  to selenium webdriver
    driver.command_executor._commands["send_command"] = ("POST", '/session/$sessionId/chromium/send_command')

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

作为引用,这里有一个小仓库来演示如何使用它: https://github.com/shawnbutton/PythonHeadlessChrome

更新 2020-05-01 有评论说这不再有效。鉴于这个补丁现在已经有一年多了,他们很可能已经改变了底层库。

关于python - 使用 chrome headless 和 selenium 下载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45631715/

相关文章:

python - 使用 matplotlib 同时绘制两个函数

python - 无法将 Python 文件作为 .exe 文件运行,出现错误 'ModuleNotFoundError: No module named ' pandas' '

Python copy.copy() 与 NumPy np.copy()

javascript - 强制同步 iframe 加载

google-chrome - Chrome devTools 不再显示我的窗口大小

python - 如何使用 python selenium 将文本添加到页面?

python - 将 Pandas 数据框转换为 RCV

google-chrome - 检测 chrome 扩展更新

python - 如何使用 Selenium 连接到 icloud.com?

java - 单击事件在浏览器中直接运行脚本时有效,但在弹出窗口中访问相同的 UI 时无效