下载铬无头和硒

The*_*tan 54 python selenium google-chrome google-chrome-headless

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

# 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
Run Code Online (Sandbox Code Playgroud)
# 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
Run Code Online (Sandbox Code Playgroud)

我甚至尝试添加默认路径:

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

添加默认路径在正常实现中起作用,但无头版本中仍存在相同的问题.

如何在无头模式下启动下载?

Mic*_*ntz 55

Chromium 开发人员最近添加了第二种无头模式(2021 年)。请参阅https://bugs.chromium.org/p/chromium/issues/detail?id=706008#c36

他们后来在 2023 年为 Chrome 109 重命名了该选项 -> https://github.com/chromium/chromium/commit/e9c516118e2e1923757ecb13e6d9fff36775d1f4

对于 Chrome 109 及更高版本,该--headless=new标志现在允许您在新的无头模式下获得 Chrome 的完整功能,您甚至可以在其中运行扩展程序。(对于 Chrome 版本 96 到 108,请使用--headless=chrome

用法:(Chrome 109及以上版本):

options.add_argument("--headless=new")
Run Code Online (Sandbox Code Playgroud)

用法:(Chrome 96 到 Chrome 108):

options.add_argument("--headless=chrome")
Run Code Online (Sandbox Code Playgroud)

如果某些功能可以在常规 Chrome 中运行,那么它现在也应该可以在较新的无头模式中运行。

  • FWIW,现已正式宣布在 Chrome 112 中提供此功能:https://developer.chrome.com/articles/new-headless/ 请报告您遇到的任何错误,以便我们修复它们! (3认同)
  • 今天测试了一下,成功了。 (2认同)
  • 这太神奇了;) (2认同)
  • 非常感谢你拯救了我的一天。直到 108 版本,甚至“--headless”也对我有用。 (2认同)

小智 50

是的,这是一个"功能",为了安全.如前所述,这里是错误讨论: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)
Run Code Online (Sandbox Code Playgroud)

这里有一个小回复来演示如何使用它:https: //github.com/shawnbutton/PythonHeadlessChrome

  • 我尝试了这个,但对我不起作用:(当我完全尝试那样时,我什么也没有,当我只是关闭“无头”模式时,我得到了文件,但是Chrome崩溃了。如果我完全删除了此答案中的代码以及无头模式,Chrome的运行效果与预期相同。我认为Chrome的API已更改? (2认同)
  • 这仍然是最新的吗?我在github中尝试了该方法,它不下载文件。我测试过代码可以在没有无头模式下下载文件。打印输出显示:来自浏览器的响应:result:value:None (2认同)

Som*_*lse 17

这是Chrome的一项功能,可防止软件将文件下载到您的计算机.但有一个解决方法.在这里阅读更多相关信息.

你需要做的是通过DevTools启用它,像这样:

async function setDownload () {
  const client = await CDP({tab: 'ws://localhost:9222/devtools/browser'});
  const info =  await client.send('Browser.setDownloadBehavior', {behavior : "allow", downloadPath: "/tmp/"});
  await client.close();
}
Run Code Online (Sandbox Code Playgroud)

这是一个人在上述主题中给出的解决方案.这是他的评论.

  • 你怎么用硒在Python中做到这一点? (5认同)
  • 此解决方案需要修补Chrome,这不是一种解决方法.Chrome v62.0.3186.0中的命令`Browser.setDownloadBehavior`**不存在**. (4认同)

Fay*_*çal 16

这是基于Shawn Button答案的 Python的一个工作示例.我用Chromium 68.0.3440.75chromedriver 2.38进行了测试

from selenium import webdriver
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_experimental_option("prefs", {
  "download.default_directory": "/path/to/download/dir",
  "download.prompt_for_download": False,
})

chrome_options.add_argument("--headless")
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/to/download/dir"}}
command_result = driver.execute("send_command", params)

driver.get('http://download-page.url/')
driver.find_element_by_css_selector("#download_link").click()
Run Code Online (Sandbox Code Playgroud)


小智 9

更新的 PYTHON 解决方案 - 已于 2021 年 3 月 4 日在 chromedriver v88 和 v89 上进行测试

这将允许您在无头模式下单击下载文件。

    from selenium import webdriver
    from selenium.webdriver.common.keys import Keys
    from selenium.webdriver.chrome.options import Options

    # Instantiate headless driver
    chrome_options = Options()

    # Windows path
    chromedriver_location = 'C:\\path\\to\\chromedriver_win32\\chromedriver.exe'
    # Mac path. May have to allow chromedriver developer in os system prefs
    '/Users/path/to/chromedriver'

    chrome_options.add_argument("--headless")
    chrome_options.add_argument("--no-sandbox")
    chrome_options.add_argument("--disable-dev-shm-usage")
    
    chrome_prefs = {"download.default_directory": r"C:\path\to\Downloads"} # (windows)
    chrome_options.experimental_options["prefs"] = chrome_prefs

    driver = webdriver.Chrome(chromedriver_location,options=chrome_options)

    # Download your file
    driver.get('https://www.mockaroo.com/')
    driver.find_element_by_id('download').click()
Run Code Online (Sandbox Code Playgroud)