Python 在无头模式下通过Google Chrome下载文件
我在“正常”模式下用Cromedrive编写代码,工作正常。当我切换到无头模式时,它不会下载文件。我已经尝试了在互联网上找到的代码,但没有成功Python 在无头模式下通过Google Chrome下载文件,python,selenium,google-chrome,selenium-chromedriver,google-chrome-headless,Python,Selenium,Google Chrome,Selenium Chromedriver,Google Chrome Headless,我在“正常”模式下用Cromedrive编写代码,工作正常。当我切换到无头模式时,它不会下载文件。我已经尝试了在互联网上找到的代码,但没有成功 chrome_options = Options() chrome_options.add_argument("--headless") self.driver = webdriver.Chrome(chrome_options=chrome_options, executable_path=r'{}/chromedriver'.format(os.ge
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。如果它在另一个驱动器中工作,对我来说没问题。首先是解决方案
最低先决条件:
- Selenium客户端版本:
- Chrome版本:Chrome v77.0
- ChromeDriver版本:
- 代码块:
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
- 文件下载快照:
细节 通过下载文件是自推出以来最受欢迎的功能之一 从那时起,不同的贡献者发表了不同的工作方法,其中一些是:
Headless Chromium
下载文件的功能
在讨论中提到: 无头下载的工作方式有点不同。这里有
Page.setDownloadBehavior
devtools命令来设置下载文件夹。我们正在研究一种使用DevTools网络拦截的方法,通过DevTools传输下载的文件
有关详细讨论,请访问
最后,修订似乎为我们解决了这个问题
[ChromeDriver]增加了对无头模式下载文件的支持 以前,在headless模式下运行的Chromedriver不会正确下载文件,因为它稀疏地解析给定给它的首选项文件。来自headless chrome团队的工程师建议使用DevTools的“Page.setDownloadBehavior”来修复此问题。此变更列表实现此修复。下载的文件默认为当前目录,可以在实例化chromedriver实例时使用download_dir进行设置。还添加了测试以确保正确的下载功能 这是和 从发行说明:
Resolved issue 2454: Headless mode doesn't save file downloads [Pri-2]
解决方案
- 将ChromeDriver更新至最新级别
- 将Chrome更新到Chrome版本77.0级别。(根据)
- 注意:Chrome v77.0尚未发布/推出,因此在此之前,您可以从以下位置下载并安装开发构建和测试:
- 来自
奥特罗 但是,Mac OSX用户需要等待他们的馅饼。首先解决方案 最低先决条件:
- Selenium客户端版本:
- Chrome版本:Chrome v77.0
- ChromeDriver版本:
- 代码块:
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
- 文件下载快照:
细节 通过下载文件是自推出以来最受欢迎的功能之一 从那时起,不同的贡献者发表了不同的工作方法,其中一些是:
Headless Chromium
下载文件的功能
在讨论中提到: 无头下载的工作方式有点不同。这里有
Page.setDownloadBehavior
devtools命令来设置下载文件夹。我们正在研究一种使用DevTools网络拦截的方法,通过DevTools传输下载的文件
有关详细讨论,请访问
最后,修订似乎为我们解决了这个问题
[ChromeDriver]增加了对无头模式下载文件的支持 以前,在headless模式下运行的Chromedriver不会正确下载文件,因为它稀疏地解析给定给它的首选项文件。来自headless chrome团队的工程师建议使用DevTools的“Page.setDownloadBehavior”来修复此问题。此变更列表实现此修复。下载的文件默认为当前目录,可以在实例化chromedriver实例时使用download_dir进行设置。还添加了测试以确保正确的下载功能 这是和 从发行说明:
Resolved issue 2454: Headless mode doesn't save file downloads [Pri-2]
解决方案
- 将ChromeDriver更新至最新级别
- 将Chrome更新到Chrome版本77.0级别。(根据)
- 注意:Chrome v77.0尚未发布/推出,因此在此之前,您可以从以下位置下载并安装开发构建和测试:
- 来自
奥特罗
然而,Mac OSX用户需要等待他们的馅饼。我认为你不应该使用浏览器下载内容,把它留给Chrome开发者/测试人员 我相信你应该获得你想要下载的元素,并使用
如果站点需要身份验证,则可以从浏览器实例获取并将其传递给 我认为你不应该使用浏览器下载内容,把它留给Chrome开发者/测试人员 我相信你应该获得你想要下载的元素,并使用
如果站点需要身份验证,则可以从浏览器实例获取并将其传递给 对于javascript,请使用以下代码:
const chrome = require('selenium-webdriver/chrome');
let options = new chrome.Options();
options.addArguments('--headless --window-size=1500,1200');
options.setUserPreferences({ 'plugins.always_open_pdf_externally': true,
"profile.default_content_settings.popups": 0,
"download.default_directory": Download_File_Path });
driver = await new webdriver.Builder().setChromeOptions(options).forBrowser('chrome').build();
单击下载按钮后立即切换选项卡:
await driver.sleep(1000);
var Handle = await driver.getAllWindowHandles();
await driver.switchTo().window(Handle[1]);
对于javascript,请使用以下代码:
const chrome = require('selenium-webdriver/chrome');
let options = new chrome.Options();
options.addArguments('--headless --window-size=1500,1200');
options.setUserPreferences({ 'plugins.always_open_pdf_externally': true,
"profile.default_content_settings.popups": 0,
"download.default_directory": Download_File_Path });
driver = await new webdriver.Builder().setChromeOptions(options).forBrowser('chrome').build();
单击下载按钮后立即切换选项卡:
await driver.sleep(1000);
var Handle = await driver.getAllWindowHandles();
await driver.switchTo().window(Handle[1]);
中国