繁体   English   中英

以无头模式通过谷歌浏览器下载文件

[英]Download file through Google Chrome in headless mode

我在 Cromedrive 中以“正常”模式编写代码并且工作正常。 当我更改为无头模式时,它不会下载文件。 我已经尝试了我在 inte.net 周围找到的代码,但没有用。

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。 如果它在另一个驱动器上工作,那对我来说很好。

先说解决办法

最低先决条件:

要下载文件,请单击本网站中带有文本的元素作为下载数据,您可以使用以下解决方案:

  • 代码块:

     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
  • 文件下载快照:

ChromeHeadless下载


细节

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]

解决方案


奥特罗

然而, Mac OSX用户需要等待他们的馅饼作为On Chromedriver,在 MacOSX 上发送 Page.setDownloadBehavior 后无头 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]);

Chomedriver 版本:95.0.4638.54
Chrome 版本 95.0.4638.69

    from selenium.webdriver.chrome.options import Options    
 
    options = Options()
    options.add_argument("--headless")
    options.add_argument("--start-maximized")
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-extensions")
    options.add_argument('--disable-dev-shm-usage')    
    options.add_argument("--disable-gpu")
    options.add_argument('--disable-software-rasterizer')
    options.add_argument("user-agent=Mozilla/5.0 (Windows Phone 10.0; Android 4.2.1; Microsoft; Lumia 640 XL LTE) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Mobile Safari/537.36 Edge/12.10166")
    options.add_argument("--disable-notifications")

    options.add_experimental_option("prefs", {
        "download.default_directory": "C:\\link\\to\\folder",
        "download.prompt_for_download": False,
        "download.directory_upgrade": True,
        "safebrowsing_for_trusted_sources_enabled": False,
        "safebrowsing.enabled": False
        }
    )

似乎有效的是我使用“\\\\”而不是“/”作为地址。 后一种方法没有抛出任何错误,但也没有下载任何文档。 但是,使用双反斜杠可以完成这项工作。

import pathlib
from selenium.webdriver import Chrome
driver = Chrome()
driver.execute_cdp_cmd("Page.setDownloadBehavior", {
    "behavior": "allow",
    "downloadPath": str(pathlib.Path.home().joinpath("Downloads"))
})

我认为您不应该使用浏览器来下载内容,将其留给 Chrome 开发人员/测试人员。

我相信您应该获取要下载的元素的href 属性并使用requests 库获取它

如果您的站点需要身份验证,您可以从浏览器实例中获取cookie并将它们传递给requests.Session

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM