我正在Cromedrive中以“正常”模式编写代码,并且工作正常。当我更改为无头模式时,它不会下载文件。我已经尝试过在互联网上找到的代码,但是没有用。
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。如果它可以在另一个驱动器中工作,那对我来说很好。
答案 0 :(得分:4)
最低要求:
- Selenium 客户端版本:Selenium v3.141.59
- Chrome 版本:Chrome v77.0
- ChromeDriver 版本:ChromeDriver v77.0
要下载文件,请在this website中单击文本为 Download Data 的元素,您可以使用以下解决方案:
代码块:
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被引入以来,通过Headless Chrome下载文件是最受欢迎的功能之一。
此后,不同的贡献者发布了不同的解决方法,其中一些是:
现在,好消息是 Chromium 团队已正式宣布通过Headless Chromium
下载文件功能。
在讨论Headless mode doesn't save file downloads @eseckler中提到:
无头下载中的下载有所不同。有
Page.setDownloadBehavior
devtools命令来设置下载文件夹。我们正在研究一种使用DevTools网络拦截的方法,也可以通过DevTools流下载的文件。
可以在Issue 696481: Headless mode doesn't save file downloads
找到详细的讨论最后,@bugdroid修订似乎为我们解决了这个问题。
以前,以无头模式运行的Chromedriver无法正确下载文件,原因是它稀疏地解析提供给它的首选项文件。无头Chrome团队的工程师建议使用DevTools的“ Page.setDownloadBehavior”来解决此问题。此变更列表实现此修复程序。下载的文件默认为当前目录,可以在实例化chromedriver实例时使用download_dir进行设置。还添加了测试,以确保正确的下载功能。
摘自ChromeDriver v77.0.3865.40 (2019-08-20)发行说明:
Resolved issue 2454: Headless mode doesn't save file downloads [Pri-2]
注意: Chrome v77.0 尚未发布或发布,因此在此之前,您可以从以下位置下载并安装开发版本并进行测试:
但是 Mac OSX 用户正在等待On Chromedriver, headless chrome crashes after sending Page.setDownloadBehavior on MacOSX的馅饼。
答案 1 :(得分:2)
对于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]);
答案 2 :(得分:0)
我认为您不应该使用浏览器来下载内容,而是将其留给Chrome开发人员/测试人员使用。
我相信您宁愿获得href attribute想要下载的元素并使用requests library
如果您的站点需要身份验证,则可以从浏览器实例中获取cookies并将其传递给requests.Session。