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 中运行,那么它现在也应该可以在较新的无头模式中运行。
小智 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
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)
这是一个人在上述主题中给出的解决方案.这是他的评论.
Fay*_*çal 16
这是基于Shawn Button答案的 Python的一个工作示例.我用Chromium 68.0.3440.75和chromedriver 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)