4

As it is still not clear for me how to download files using --headless mode in ChromeDriver - selenium [Java], add here please the example of how to do so, I try to do it like that (the file downloading works properly without --headless option):

ChromeOptions lChromeOptions = new ChromeOptions();
HashMap<String, Object> lChromePrefs = new HashMap<String, Object>();
lChromePrefs.put("profile.default_content_settings.popups", 0);
lChromePrefs.put("download.default_directory", _PATH_TO_DOWNLOAD_DIR);
lChromePrefs.put("browser.set_download_behavior", "{ behavior: 'allow' , downloadPath: '"+_PATH_TO_DOWNLOAD_DIR+"'}");

lChromeOptions.addArguments("--headless");
lChromeOptions.addArguments("--disable-gpu");
lChromeOptions.setExperimentalOption("prefs", lChromePrefs);
WebDriver lWebDriver = new ChromeDriver(lChromeOptions);

From what I know, downloading files in headless mode should be possible since Chrome v60+ by setting Browser.setDownloadBehaviour(true, _DIRECTORY) but I cant find the information whether ChromeDriver already supports it or it is just me using wrong chrome preferences as arguments

ChromeDriver version: 2.34 Selenium + WebDriver version: 3.8.1

Bartek Szczypien
  • 333
  • 4
  • 17

3 Answers3

8

In Java use like this :

System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriver");
         ChromeOptions options = new ChromeOptions();
                options.addArguments("--test-type");
                options.addArguments("--headless");
                options.addArguments("--disable-extensions"); //to disable browser extension popup

                ChromeDriverService driverService = ChromeDriverService.createDefaultService();
                ChromeDriver driver = new ChromeDriver(driverService, options);

                Map<String, Object> commandParams = new HashMap<>();
                commandParams.put("cmd", "Page.setDownloadBehavior");
                Map<String, String> params = new HashMap<>();
                params.put("behavior", "allow");
                params.put("downloadPath", "//home//vaibhav//Desktop");
                commandParams.put("params", params);
                ObjectMapper objectMapper = new ObjectMapper();
                HttpClient httpClient = HttpClientBuilder.create().build();
                String command = objectMapper.writeValueAsString(commandParams);
                String u = driverService.getUrl().toString() + "/session/" + driver.getSessionId() + "/chromium/send_command";
                HttpPost request = new HttpPost(u);
                request.addHeader("content-type", "application/json");
                request.setEntity(new StringEntity(command));
                httpClient.execute(request);
        driver.get("http://www.seleniumhq.org/download/");
        driver.findElement(By.linkText("32 bit Windows IE")).click();
Stephen Kennedy
  • 20,585
  • 22
  • 95
  • 108
Vaibhav Sharma
  • 129
  • 2
  • 5
  • above code, works fine for PDF files but not work for `.cfm` file in headless mode. – hrdkisback Feb 06 '19 at 09:19
  • Hi, In My case the the download(csv file) happens in a new tab when i click a button. This code is not working for me. Any solution? – anandhu Dec 06 '19 at 13:26
  • Hello guys ! somebody found the solution after the lastest version released ? chromedriver 83 + selenium-java 4.0.0-alpha6 ? – Molina Henrique Jun 09 '20 at 15:14
0

As per official release page of chrome driver, a fix has been introduced for this issue. Any chrome driver version greater than 77 will be able to download the file in headless mode.

options.addArguments("--headless");
papanito
  • 2,349
  • 2
  • 32
  • 60
0

This worked for me.

    ChromeOptions options = new ChromeOptions();
    Map<String, Object> prefs = new HashMap<>();
    prefs.put("credentials_enable_service", false);
    prefs.put("profile.password_manager_enabled", false);
    prefs.put("download.prompt_for_download", false);
    prefs.put("download.default_directory", downloadFilepath);
    prefs.put("browser.set_download_behavior", "{behavior : 'allow' , downloadPath: '"+downloadFilepath+"'}");
    options.addArguments("--headless=new");
    options.addArguments("--window-size=1920,1080");
    options.addArguments("--disable-extensions");
    options.addArguments("--proxy-server='direct://'");
    options.addArguments("--proxy-bypass-list=*");
    options.addArguments("--start-maximized");
    options.addArguments("--disable-gpu");
    options.addArguments("--disable-dev-shm-usage");
    options.addArguments("--no-sandbox");
    options.addArguments("--ignore-certificate-errors");
    options.setExperimentalOption("prefs", prefs);