python - 在无头模式下通过 Google Chrome 下载文件
问题描述
我在 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。如果它在另一个驱动器中工作,那对我来说很好。
解决方案
首先解决方案
最低先决条件:
- Selenium客户端版本:Selenium v3.141.59
- Chrome版本:Chrome v77.0
- ChromeDriver版本:ChromeDriver v77.0
要下载文件,请单击本网站中带有文本的元素作为下载数据,您可以使用以下解决方案:
代码块:
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 Chrome推出以来,通过Headless Chromium下载文件是最受欢迎的功能之一。
从那时起,不同的贡献者发布了不同的解决方法,其中一些是:
现在,好消息是Chromium团队已经正式宣布了下载文件Headless Chromium
功能的到来。
在讨论无头模式不保存文件下载 @eseckler提到:
无头下载的工作方式略有不同。有
Page.setDownloadBehavior
devtools 命令来设置下载文件夹。我们正在研究一种使用 DevTools 网络拦截的方法,也可以通过 DevTools 流式传输下载的文件。
可以在问题 696481 中找到详细讨论:无头模式不保存文件下载
最后,@bugdroid修订版似乎为我们解决了这个问题。
[ChromeDriver] 增加了对无头模式下载文件的支持
以前,在 headless 模式下运行的 Chromedriver 无法正确下载文件,因为它稀疏地解析了给它的首选项文件。headless 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]
解决方案
- 将ChromeDriver更新到最新的 ChromeDriver v77.0级别。
- 将Chrome更新到 Chrome 版本 77.0级别。(根据ChromeDriver v76.0 发行说明)
注意:Chrome v77.0尚未正式发布/推送,因此在此之前,您可以从以下位置下载并安装开发版本并进行测试:
奥特罗
但是, Mac OSX用户在 Chromedriver 上等待他们的馅饼,在 MacOSX 上发送 Page.setDownloadBehavior 后,无头 chrome 崩溃。
推荐阅读
- java - Spring React - 发出 zipWith 时的问题
- hadoop - 我可以在 Running 集群上应用 Ambari 吗?
- sql-server - 使用 powershell 脚本未在邮件中显示图像
- php - 为什么第二个 move_uploaded_file 函数在此代码中不起作用?
- wordpress - Woocommerce 产品页面未显示更新价格
- python - python中系列的新列变量
- javascript - TypeError:无法在“MediaStream”上执行“addTrack”:参数 1 不是“MediaStreamTrack”类型
- reactjs - 如何为 react-bootstrap-typeahead 解决此错误
- python - Python 中的属性字典元素 - Dict.Element - PyTricks
- javascript - Gatsby/Wordpress 站点的 Netlify 部署失败